团结:游戏的特殊运动

时间:2017-09-10 09:42:58

标签: c# android unity3d 2d game-engine

我用鼠标光标为我的太空游戏和宇宙飞船物体(玩家)编写动作。

目前有以下代码:

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);
        }
    }    

}

但是当点距离玩家太近(有无限循环)时,我有运动精度和旋转的问题。

这个运动系统的想法用以下图像描述:

(玩家演员是绿色,路径是灰色,目的地点是红色)。

movement plan

我希望有人可以帮助我。

谢谢!

1 个答案:

答案 0 :(得分:1)

如果我理解你的问题,问题是玩家的动作永远不会停止,因为代码无法达到终点。

要解决此问题,您可以添加可接受的精确边距。

因此,计算您希望的旋转或您想要的移动与玩家实际旋转/位置之间的差异是否小于给定变量,例如小于0.05%。

这样你就可以让程序知道如果它只是在0.05%的精度范围内,那么它就可以停止移动。

否则,如果程序从未达到完整和完美的旋转和位置,由于计算和运动模式中的轻微数学不精确,它将继续无限调整。