我用鼠标光标为我的太空游戏和宇宙飞船物体(玩家)编写动作。
目前有以下代码:
using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;
public class Move : MonoBehaviour {
public float speed = 1.5f;
public float rotationSpeed = 90f;
public float rotPrecision = 0.1f;
public float movePrecision = 0.1f;
private Vector3 pos;
private Quaternion qTo;
void Start () {
pos = transform.position;
qTo = transform.rotation;
}
void Update () {
if (!EventSystem.current.IsPointerOverGameObject())
{
if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
{
pos = Input.mousePosition;
pos.z = transform.position.z - Camera.main.transform.position.z;
pos = Camera.main.ScreenToWorldPoint(pos);
}
var dir = pos - transform.position;
qTo = Quaternion.LookRotation(Vector3.forward, pos - transform.position);
if (Quaternion.Angle(transform.rotation, qTo) >= rotPrecision) //just set your own precision
transform.rotation = Quaternion.RotateTowards(transform.rotation, qTo, Time.deltaTime * rotationSpeed);
if (Vector3.Distance(transform.position, pos) > movePrecision) // 0.1f
transform.Translate(Vector3.up * speed * Time.deltaTime);
}
}
}
但是当点距离玩家太近(有无限循环)时,我有运动精度和旋转的问题。
这个运动系统的想法用以下图像描述:
(玩家演员是绿色,路径是灰色,目的地点是红色)。
我希望有人可以帮助我。
谢谢!
答案 0 :(得分:1)
如果我理解你的问题,问题是玩家的动作永远不会停止,因为代码无法达到终点。
要解决此问题,您可以添加可接受的精确边距。
因此,计算您希望的旋转或您想要的移动与玩家实际旋转/位置之间的差异是否小于给定变量,例如小于0.05%。
这样你就可以让程序知道如果它只是在0.05%的精度范围内,那么它就可以停止移动。
否则,如果程序从未达到完整和完美的旋转和位置,由于计算和运动模式中的轻微数学不精确,它将继续无限调整。