我正在制作一个游戏对象的巡逻脚本。我希望物体能够平稳,缓慢地旋转,以面对它的巡逻目标。
不幸的是,该对象会抓住它的新位置。
我在团结论坛上问过,无法得到答案。
如何让旋转平稳而缓慢?
这是我的代码。
public Transform[] patrol;
public int Currentpoint;
public float moveSpeed;
public Vector3 john = new Vector3(0,1,0);
public Vector3 targetLocation;
void Start()
{
}
void Update()
{
if (transform.position == patrol [Currentpoint].position) {
Currentpoint++;
if (Currentpoint >= patrol.Length) {
Currentpoint = 0;
}
targetLocation = patrol [Currentpoint].position;
Vector3 targetDir = targetLocation - transform.position;
float angle = Mathf.Atan2 (targetDir.y, targetDir.x) * Mathf.Rad2Deg;
transform.localRotation = Quaternion.SlerpUnclamped (transform.localRotation, Quaternion.AngleAxis (angle, Vector3.forward), Time.deltaTime * 3);
Debug.Log (Currentpoint);
}
transform.position = Vector3.MoveTowards (transform.position, patrol [Currentpoint].position, moveSpeed * Time.deltaTime);
}
答案 0 :(得分:0)
public static Quaternion Slerp(Quaternion a,Quaternion b,float t);参数t被钳位到[0,1]
的范围内你的时间3是把它扔掉所以它不在0-1之间......我相信
答案 1 :(得分:0)
如果您喜欢某些数学,那么我会为您提供解决方案。
您希望围绕另一个旋转对象,例如地球和太阳。也许可以使用其他一些解决方案,但我会通过LookAt和圆的参数方程来实现。
x = r * cos(theta) + displacementX
y = r * sin(theta) + displacementY
其中r
是半径,距您的距离
displacementX
和displacementY
是与原点的距离。如果两者(displacementX
和displacementY
)都为0,那么它将围绕origin (0,0)
旋转。换句话说,displacementX
和displacementY
是轮换的起源。
在对象(地球)脚本中,按照以下步骤进行操作
public Transform _sun;
float _theta = 0;
void Start ()
{
StartCoroutine ("ChangeAngle");
}
void Update ()
{
transform.LookAt (_sun);
float newX = (5 * Mathf.Cos (_theta)) + _sun.position.x;
float newY = (5 * Mathf.Sin (_theta)) + _sun.position.y;
transform.position = new Vector3 (newX, newY, _sun.position.z);
}
IEnumerator ChangeAngle ()
{
while (true) {
yield return new WaitForSeconds (0.01f);
_theta += 0.1f;
if (_theta >= 360)
_theta = 0;
}
}
你可以进一步玩它
答案 2 :(得分:0)
我找到了答案,
事实证明,将旋转指令放在if语句中是个问题。我将旋转转换为函数,然后将函数放置在同一循环段中的一般巡逻运动之上。
我不知道为什么会有效。
感谢大家的帮助。