0

我需要在世界空间中相对于主摄像机所面对的方向移动我的目标对象,但仅在 x&z 轴上并且相对于我的玩家在 y 轴上。

非常感谢任何指导。

public class test : MonoBehaviour {

public string raise = "Raise";
public string lower = "Lower";
public string left = "Left";
public string right = "Right";
public string closer = "Closer";
public string further = "Further";

public GameObject target;


private float xPos;
private float yPos;
private float zPos;


// Use this for initialization
void Start () {


    xPos = target.transform.position.x;
    yPos = target.transform.position.y;
    zPos = target.transform.position.z;

}

void FixedUpdate () {

    Vector3 currPos = target.transform.position;
    Vector3 nextPos = new Vector3 (xPos, yPos, zPos);

    target.GetComponent < Rigidbody > ().velocity = (nextPos - currPos) * 10;

    if (Input.GetButton (raise)) {
        print ("Moving Up");
        yPos = yPos + 0.05f;
    }
    if (Input.GetButton (lower)) {
        print ("Moving Down");
        yPos = yPos - 0.05f;
    }
    if (Input.GetButton (left)) {
        print ("Moving Left");
        xPos = xPos - 0.05f;
    }
    if (Input.GetButton (right)) {
        print ("Moving Right");
        xPos = xPos + 0.05f;
    }
    if (Input.GetButton (closer)) {
        print ("Moving Closer");
        zPos = zPos - 0.05f;
    }
    if (Input.GetButton (further)) {
        print ("Moving Further");
        zPos = zPos + 0.05f;
    }
}
4

1 回答 1

2

您可以像这样获得相机的方向:

var camDir = Camera.main.transform.forward;

您只需要 x/y 分量,因此我们将重新规范化该向量:

camDir.y = 0;
camDir.Normalized();

这就是前向向量。因为它现在实际上是一个二维向量,我们可以很容易地得到凸轮的右手向量:

var camRight = new Vector3(camDir.z, 0f, -camDir.x);

我将假设您的播放器的向上方向正好在 y 轴上。如果它不同,则在该向量中添加:

var playerUp = Vector3.up;

现在,在您的示例中,您正在执行手动集成,然后将其传递给刚体系统以再次进行集成。让我们直接计算出我们自己的速度:

var newVel = Vector3.zero;
if (/*left*/) newVel -= camRight * 0.05;
if (/*right*/) newVel += camRight * 0.05;
if (/*closer*/) newVel -= camDir * 0.05;
if (/*farter*/) newVel += camDir * 0.05;
if (/*raise*/) newVel += playerUp * 0.05;
if (/*lower*/) newVel -= playerUp * 0.05;

如果您想移动得更快或更慢,请将其更改为 0.05。你可以在这里做很多事情来让控制感觉非常好,比如有一个小死区或直接从模拟输入而不是按钮输入。

然后最后将其提交到刚体中:

target.GetComponent<Rigidbody>().velocity = newVel;
于 2015-04-29T17:36:06.977 回答