我想通过现实的移动和旋转将船移动到我单击BUT的位置:

unity3d - 逼真的BOAT/SHIP运动和旋转(2d)-LMLPHP

(http://i.imgur.com/Pk8DOYP.gif)

这是我的代码(附加到我的船游戏对象上):

基本上,当我单击某处时,它将移动船,直到其到达我首先单击的位置为止(我为您简化了代码)

using UnityEngine;
using System.Collections;


public class BoatMovement : MonoBehaviour {

    private Vector3 targetPosition;

    private float speed = 10f;
    private bool isMoving;


    void Update(){

        if (!isMoving && Input.GetMouseButton (0)) {

            targetPosition = Camera.main.ScreenToWorldPoint (Input.mousePosition);
            isMoving = true;
        }


        if (isMoving) {
            moveToPosition ();
        }
    }

    void  moveToPosition() {


        transform.position = Vector3.MoveTowards (transform.position, new Vector3(targetPosition.x, targetPosition.y, 0f), speed * Time.deltaTime);

        if (transform.position.x == targetPosition.x && transform.position.y == targetPosition.y) {
            isMoving = false;
        }

    }
}

经过一些研究和尝试,我没有找到做我想要的方法。

谢谢你的帮助

最佳答案

这个问题有两个部分,应该完全分开,而且任何一个方程都不应该干扰另一个方程。

首先是船舶的向前运动,这可以通过两种方式实现:

如果使用刚体

void Propel()
{
    float speed = 150f;
    RigidBody rb = GetComponent<RigidBody>();
    Transform transform = GetComponent<Transform>();
    rb.AddForce(transform.forward * speed * Time.deltaTime); // <--- I always forget if its better to use transform.forward or Vector3.forward. Try both
}

如果没有刚体
void Propel()
{
    float speed = 150f;
    Transform transform = GetComponent<Transform>();
    transform.Translate(transform.forward * speed * Time.deltaTime, Space.World);
}

现在第二个是船的转向,这也可以通过两种方式实现:

使用刚体
IEnumerator TurnShip(Vector3 endAngle)
{
    float threshold = Single.Epsilon;
    float turnSpeed = 150f;
    RigidBody rb = GetComponent<RigidBody>();
    while (Vecotr3.Angle(transform.forward, endAngle) > threshold)
    {
        rb.AddTorque(transform.up * turnSpeed * Time.deltaTime);
        yield return null;
    }
}

没有刚体
IEnumerator TurnShip(Vector3 endAngle)
{
    float threshold = Single.Epsilon;
    float turnSpeed = 150f;
    float step = turnSpeed * Time.deltaTime;
    while (Vector3.Angle(transform.forward, endAngle) > threshold)
    {
        newDir = Vector3.RotateTowards(transform.forward, endAngle, step);
        transform.rotation = Quaternion.LookRotation(newDir);
        yield return null;
    }
}

然后,当然,IEnumerators的调用方式如下:
StartCoroutine(TurnShip(new Vector3(12f, 1f, 23f));

注意事项:
  • 这是伪代码,我没有对其进行任何测试,因此只知道使其有效取决于您,我只是为您提供遵循的正确路径。
  • 方法开头的所有变量都是全局变量,因此请在需要的地方声明它们。
  • 关于unity3d - 逼真的BOAT/SHIP运动和旋转(2d),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41576456/

    10-12 13:53