首页 > 解决方案 > transform.forward 仅适用于 0,0,0 旋转,我想让它独立于旋转

问题描述

我有一个Camera脚本,它跟随坦克,并将一个空GameObject名称作为目标,我从相机到目标分配新的位置,坦克只看这个目标GameObject,如果Camera在 0,0,0,旋转,工作正常,但是如果我从检查员那里改变了它的旋转让说 0,145,0.. 那么它不能正常工作,目标GameObject不知道哪个位置,这是我的代码到目前为止

using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Camera : MonoBehaviour
{
public Transform tank;
private Transform target;
public float distance = 5.0f;
public float xSpeed = 250.0f;
public float ySpeed = 120.0f;
public float yMinLimit = -20.0f;
public float yMaxLimit = 80.0f;

private float x;
private float y;

public float heightOffset = 0;

void Awake()
{
    Vector3 angles = transform.eulerAngles;
    x = angles.x;
    y = angles.y;
    GameObject newTarget = new GameObject("target");
    target = newTarget.transform;
    FindObjectOfType<TankGunController>().target = target;
}

void LateUpdate()
{
    if (tank != null)
    {
        x += (float)(Input.GetAxis ("Mouse X") * xSpeed * 0.02f);
        y -= (float)(Input.GetAxis ("Mouse Y") * ySpeed * 0.02f);
        y = ClampAngle (y, yMinLimit, yMaxLimit);
        Quaternion rotation = Quaternion.Euler(y, x, 0);
        Vector3 position = rotation * (new Vector3 (0.0f, heightOffset, -distance)) + tank.position;

        transform.rotation = rotation;
        transform.position = position;
        target.position = transform.position + (transform.forward * 100);
     }
}

private float ClampAngle(float angle, float min, float max)
{
    if (angle < -360)
    {
        angle += 360;
    }
    if (angle > 360)
    {
        angle -= 360;
    }
    return Mathf.Clamp (angle, min, max);
    }
}

标签: c#unity3d

解决方案


transform.forward总是“在变换的正向” - 是的,它考虑了旋转,这在大多数情况下非常有用。

如果您不想这样,请改用Vector3.forward - 这是一个全局不变的方向。

此外,在 Update 和 LateUpdate 中使用“Time.deltaTime”作为一个因素(但不是 FixedUpdate) - 帧需要不同数量的 ms 才能完成,这取决于游戏状态,也取决于 pc。

使用:

transform.position += Vector3.forward * 1000 * Time.deltaTime;

与以下相比,将独立于帧速率并且整体运行更流畅:

transform.position += Vector3.forward * 100;

编辑:如果你随着时间的推移增加一些东西,我写的内容很有用。我刚刚意识到您没有添加like position = position + X(类似于position += X),而是实际上为目标分配了一个偏移量。抱歉,在这种情况下忽略 deltaTime。

采用

target.position = transform.position + (Vector3.forward * 100);

如果它是“向左”而不是“向前”,则使用另一个轴,例如 Vector3.right - 这些是全局方向,但它当然取决于您的相机视图。


推荐阅读