首页 文章

怎样才能让船只在旋转后朝着它们面向的方向移动?

提问于
浏览
-1

在剧本中我有20艘太空船 . 我存储每个船的起始位置,然后检查每艘船是否移动并且在我旋转船的过程中拖曳了50个距离 . 这部分工作正常 .

现在我希望如果我将每艘船旋转180度一旦船旋转到这个方向 . 问题是即使在旋转之后船仍继续向原始方向移动 .

在脚本的顶部:

private float distanceTravelled;
public bool updateOn = true;
private Vector3 lastPosition;

List<bool> hasRotated = new List<bool>();
List<float> distanceTraveled = new List<float>();
List<Vector3> lastPositions = new List<Vector3>();

在“开始”功能中,我添加了所有子项的起始位置,并将每个子项设置为false:

private void Start()
    {
        UpdateSpheres ();
        spheres = GameObject.FindGameObjectsWithTag("MySphere");
        for(int index = 0; index < spheres[0].transform.childCount;index++)
        {
            Transform child = spheres[0].transform.GetChild(index);
            lastPosition = new Vector3(child.transform.position.x,child.transform.position.y,child.transform.position.z);
            lastPositions.Add (lastPosition);
            hasRotated.Add(false);
            distanceTraveled.Add(0f);
        }
    }

在更新功能中,我创建了UpdateSpheres的船只,然后使用MoveShips移动和漫游它们:

private void Update()
    {
        UpdateSpheres();
        MoveShips ();
    }

然后在MoveShips中,我试图改变每个宇宙飞船旋转时的移动方向:

这是原始的MoveShips功能代码:

private void MoveShips()
    {
        for (int index = 0;index < spheres[0].transform.childCount;index++)
        {
            Transform oneChild = spheres[0].transform.GetChild(index);
            lastPositions[index] = oneChild.transform.position;
            oneChild.transform.position += Vector3.forward * Time.deltaTime * moveSpeed;
        }

        if (updateOn == true) {
            for(int index =0;index < spheres[0].transform.childCount;index++)
            {
                Transform child = spheres[0].transform.GetChild(index);

                distanceTraveled[index] += Vector3.Distance (child.transform.position, lastPositions [index]);
                if (distanceTraveled[index] >= 50 && !hasRotated[index])
                {
                    child.transform.Rotate (new Vector3 (0f, 180f, 0f));
                    hasRotated[index] = true;
                }
            }
        }
    }

然后我更改了MoveShips功能并尝试使用该行:

oneChild.transform.position -= oneChild.transform.forward * Time.deltaTime * moveSpeed;

要么

child.transform.position += child.transform.forward * Time.deltaTime * moveSpeed;

但是在所有情况下,船只保持原始方向移动,然后根据旋转后面向的位置不改变运动 .

如果我将它们旋转1度20度或180度,我希望它们在旋转后移动到它们现在面向的方向 . 即使我在X轴Y轴或Z轴上改变旋转,然后向上向右上移动,这取决于我旋转的轴 . 但我现在首先要做的是将它们旋转180度,这样它们会在旋转后改变方向并向这个方向移动 . 现在向后移动但面向方向 .

所以我试图使用子转换而不是Vector3.forward但到目前为止没有成功 .

private void MoveShips()
    {
        for (int index = 0;index < spheres[0].transform.childCount;index++)
        {
            Transform oneChild = spheres[0].transform.GetChild(index);
            lastPositions[index] = oneChild.transform.position;
            //oneChild.transform.position += Vector3.forward * Time.deltaTime * moveSpeed;
            if (distanceTraveled [index] >= 50 && !hasRotated [index]) {
                oneChild.transform.position -= oneChild.transform.forward * Time.deltaTime * moveSpeed;
            } else 
            {
                oneChild.transform.position += Vector3.forward * Time.deltaTime * moveSpeed;
            }

        }

        if (updateOn == true) {
            for(int index =0;index < spheres[0].transform.childCount;index++)
            {
                Transform child = spheres[0].transform.GetChild(index);

                distanceTraveled[index] += Vector3.Distance (child.transform.position, lastPositions [index]);
                if (distanceTraveled[index] >= 50 && !hasRotated[index])
                {
                    child.transform.Rotate (new Vector3 (0f, 180f, 0f));
                    hasRotated[index] = true;
                    //child.transform.position += child.transform.forward * Time.deltaTime * moveSpeed;
                }
            }
        }
    }

更新:

TurnShip让它们变得平滑,但它们会保持向原始方向移动而不会在转弯后改变方向 .

在脚本顶部添加:

public float smooth = 1f;
private Vector3 targetAngles;

这就是我的MoveShips现在的样子:

private void MoveShips()
    {
        for (int index = 0;index < spheres[0].transform.childCount;index++)
        {
            Transform oneChild = spheres[0].transform.GetChild(index);
            lastPositions[index] = oneChild.transform.position;
            oneChild.transform.position += Vector3.forward * Time.deltaTime * moveSpeed;
        }

        if (updateOn == true) {
            for(int index =0;index < spheres[0].transform.childCount;index++)
            {
                Transform child = spheres[0].transform.GetChild(index);

                distanceTraveled[index] += Vector3.Distance (child.transform.position, lastPositions [index]);
                if (distanceTraveled[index] >= 50 && !hasRotated[index])
                {
                    targetAngles = child.transform.eulerAngles + 180f * Vector3.up;
                    StartCoroutine (TurnShip (child.transform, child.transform.eulerAngles, targetAngles, smooth));
                    hasRotated[index] = true;
                }
            }
        }
    }

而TurnShip功能:

IEnumerator TurnShip(Transform ship, Vector3 startAngle, Vector3 endAngle, float smooth)
    {
        float lerpSpeed = 0;

        while(lerpSpeed < 1)
        {
            ship.eulerAngles = Vector3.Lerp(startAngle, endAngle, lerpSpeed);
            lerpSpeed += Time.deltaTime * smooth;
            yield return null;
        }
    }

1 回答

  • 0

    你试过Translate吗?

    // Example Forwards
    child.transform.Translate(Vector3.forward * Time.deltaTime * moveSpeed);
    // Example Backwards
    child.transform.Translate(Vector3.back * Time.deltaTime * moveSpeed);
    // you could use: left, right, up, down, forward, back
    

    文件:https://docs.unity3d.com/ScriptReference/Transform.Translate.html

相关问题