向前移动时在Z轴上旋转GameObject

时间:2014-09-19 18:09:12

标签: c# unity3d

目前我有以下代码,它可以100%用于3D游戏,但我不能让它用于2D游戏。

它应该做什么,一旦物体到达航点,它应该朝着新的航点旋转。实际发生的是它围绕xy轴而不是z轴旋转。我该怎么做才能让它只在z轴上旋转?该物体应根据转弯速度向前移动。它不应该是瞬间转弯,除非转速是一个很高的数字。但无论如何,我再次问我如何让这段代码只在z轴上旋转?

void Update () {
    if(toWaypoint > -1){
        Vector3 targetDir = wayPoints[toWaypoint].position - transform.position;
        Vector3 newDir = Vector3.RotateTowards(transform.forward, targetDir, turnSpeed * Time.deltaTime, 0.0f);
        transform.rotation = Quaternion.LookRotation(newDir);
    }
    if(!usePhysics && toWaypoint != -1){
        transform.Translate(Vector3.forward * Time.deltaTime * speed);
        next();
    }
}

3 个答案:

答案 0 :(得分:0)

对于2D游戏,外观旋转不可靠,因为前进轴不同。一种解决方法是将精灵表示为空的GameObject,其中z轴(蓝色箭头)指向精灵将旋转的方向。

答案 1 :(得分:0)

看起来你正在使用Unity3D,这让我想知道如果你在2D编辑模式下制作游戏,你首先要弄乱Z轴。除非你将两个轴设置为以某种方式包含它,否则Z轴在该模式下几乎没有任何作用。我的建议是切换到2D编辑(如果还没有),然后使用Vector2而不是Vector3 s。

另外,尝试使用其他轴之一作为旋转轴(transform.right.up而不是.forward)。

答案 2 :(得分:0)

我找到了我要找的东西:

void Update () {
    if(toWaypoint > -1){
        Vector3 vectorToTarget = wayPoints[toWaypoint].position - transform.position;
        float angle = Mathf.Atan2(vectorToTarget.y, vectorToTarget.x) * Mathf.Rad2Deg;
        Quaternion q = Quaternion.AngleAxis(angle, Vector3.forward);
        transform.rotation = Quaternion.Slerp(transform.rotation, q, Time.deltaTime * turnSpeed);
    }
    if(!usePhysics && toWaypoint != -1){
        transform.Translate(Vector3.right * Time.deltaTime * speed);
        next();
    }
}