这个脚本的初始和结束位置需要回到自身位置的0 时间不用随机 而是要在一个可以控制的时间内控制频率几次 过程方向可以分别控制随机
时间: 2024-02-24 10:55:23 浏览: 138
好的,以下是修改后的Unity脚本,实现了在可以控制的时间内进行多次随机移动,并且可以控制过程方向和起始、结束位置回到自身位置的0。
```
using UnityEngine;
public class RandomMovement : MonoBehaviour
{
public float amplitude = 1f; // 随机幅度
public int frequency = 3; // 随机频率,表示每秒钟进行的次数
public float duration = 3f; // 随机持续时间
public Vector3 axis = Vector3.up; // 随机轴向
public bool randomForward = true; // 是否随机前后方向
public bool randomRight = true; // 是否随机左右方向
public bool randomUp = true; // 是否随机上下方向
private float timer = 0f; // 计时器
private Vector3 startPos; // 初始位置
private Quaternion startRot; // 初始旋转
void Start()
{
startPos = transform.position; // 记录初始位置
startRot = transform.rotation; // 记录初始旋转
}
void Update()
{
float timePerMove = 1f / frequency; // 计算每次随机移动的时间间隔
if (timer < duration) // 在持续时间内进行随机移动
{
float randOffsetX = 0f; // X轴方向的随机位移
float randOffsetY = 0f; // Y轴方向的随机位移
float randOffsetZ = 0f; // Z轴方向的随机位移
if (randomForward) randOffsetZ = Random.Range(-1f, 1f) * amplitude; // 随机前后方向
if (randomRight) randOffsetX = Random.Range(-1f, 1f) * amplitude; // 随机左右方向
if (randomUp) randOffsetY = Random.Range(-1f, 1f) * amplitude; // 随机上下方向
Vector3 offset = new Vector3(randOffsetX, randOffsetY, randOffsetZ); // 计算总的随机位移
transform.position += transform.TransformDirection(offset); // 进行位移
timer += Time.deltaTime; // 计时器累加
if (timer >= timePerMove) // 如果超过了每次随机移动的时间间隔
{
timer -= timePerMove; // 重新计时
Quaternion randRotation = Quaternion.identity; // 随机旋转
if (randomForward) randRotation *= Quaternion.AngleAxis(Random.Range(-amplitude, amplitude), transform.forward); // 随机前后方向
if (randomRight) randRotation *= Quaternion.AngleAxis(Random.Range(-amplitude, amplitude), transform.right); // 随机左右方向
if (randomUp) randRotation *= Quaternion.AngleAxis(Random.Range(-amplitude, amplitude), transform.up); // 随机上下方向
transform.rotation *= randRotation; // 进行旋转
}
}
else // 如果超过了持续时间
{
transform.position = startPos; // 回到初始位置
transform.rotation = startRot; // 回到初始旋转
timer = 0f; // 重置计时器
}
}
void OnDrawGizmos()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(startPos, amplitude); // 在初始位置绘制一个黄色的球体
}
}
```
其中,amplitude控制随机幅度,frequency控制随机频率,duration控制随机持续时间,axis控制随机轴向,randomForward、randomRight、randomUp分别控制是否随机前后、左右、上下方向。
你可以在Unity编辑器中使用曲线调节器来控制这些参数的值,从而实现对随机范围的曲线控制。
阅读全文