向前移动时在Z轴上旋转游戏对象

本文关键字:旋转 游戏 对象 移动 | 更新日期: 2023-09-27 18:22:37

目前我有以下代码,它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();
    }
}

向前移动时在Z轴上旋转游戏对象

Look旋转对于2D游戏来说是不可靠的,因为前向轴不同。一种解决方法是将精灵设置为空GameObject的父对象,z轴(蓝色箭头)指向精灵旋转的方向。

看起来你在使用Unity3D,这让我想知道,如果你在2D编辑模式下制作游戏,为什么你一开始就要摆弄Z轴。Z轴在该模式下实际上什么都不做,除非您将两个轴设置为以某种方式包含它。我给你的建议是,如果你还没有切换到2D编辑,那么使用Vector2 s而不是Vector3 s。

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

我找到了我要找的东西:

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();
    }
}