YueZHeng_917 2024-01-29 22:18 采纳率: 57.9%
浏览 13

Unity3D怎么根据摄像头的正面旋转角色?

我在unity3D中,创建了角色和摄像机,摄像机是角色的子物体。我在角色上挂载移动脚本,在Unity的输入管理器中获取轴hor和ver,当他们不为零时会根据值的正负进行移动。在这里我用BroadcastMessage("TheisMoving","yidong");//发送消息“isMoving”给挂载物体和挂载物体的子物体及其子物体,其参数是yidong、用这行代码控制另一个脚本下移动的逻辑运行的是否。在摄像机上挂载脚本,用MouseX和Y的轴控制鼠标滑动时视角滑动。到这里都没问题,我想要“移动时,角色会根据摄像机的正前方向而旋转,最终角色的正面会与摄像机的正前方向朝向一致”。

private bool isMoving = false;//设置布尔值isMoving为否

public void TheisMoving(string message)//接收信号名称为TheisMoving的消息,创建参数message为下方接收参数
    {
        if (message == "yidong")//如果参数==yidong,则运行if下方逻辑
        {
            MovingA();//调用下方的MovingA
        }
        //这串代码是防止摄像头移动时角色正前方向始终跟随摄像机正前方向
        if (message == "Noyidong")//如果参数==Noyidong,则运行if下方逻辑。
        {
            MovingB();//调用下方的MovingB
        }
     }  
 void  Start()
    { 
 
    }

void MovingA()
    {
        isMoving = true;//修改isMoving的值为是
        Debug.Log("isMoving=true");
    }
    void MovingB()
    {
        isMoving = false;//修改isMoving的值为否
        Debug.Log("isMoving=flase");
    }

这里也可以,控制台都收的到文字。


void FixedUpdate()
    {
        if(mode == 3)
        {
            Debug.Log("mode=3");//在控制台输出mode=3
            //镜头随鼠标移动而旋转的代码已省略
            if (isMoving)
            {
                Debug.Log("BBB");
            Vector3 cameraForward = mainCamera.transform.TransformDirection(Vector3.forward);
            Vector3 smoothDirection = Vector3.Lerp(mainCamera.transform.forward, cameraForward, lerpSpeed * Time.deltaTime);
            mainCamera.transform.forward = smoothDirection;
            }
        }
    }

最初的转向方法已经删了,我是用的GPT生成的代码,在这一段。控制台也可以接收到三个B,但是角色就是不会转向,我试了很多方法,有时候可以转向了,镜头和角色疯狂抽搐晃动,于是有了下图

img

给那两个都插值了(用GPT写的),结果角色它围绕着世界坐标,移动一点马上回到0,0,0的位置。然后几天没动

我希望的效果是:if模式==3时,其下if(isMoing==true时)则让摄像头的正面与角色的正面一致。

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2024-01-29 22:20
    关注

    引自免费微信小程序:皆我百晓生

    为了让角色根据摄像头的正前方旋转,可以使用以下方法:

    1. 获取摄像头的正前方向向量。在代码中,你可以使用Camera.transform.forward来获得摄像头的正前方向向量。

    2. 将角色朝向摄像头正前方向。你可以使用Transform.LookAt()方法将角色朝向目标方向。在这种情况下,目标方向是摄像头的正前方向。代码如下:

    void FixedUpdate()
    {
        if (mode == 3)
        {
            if (isMoving)
            {
                Vector3 cameraForward = mainCamera.transform.up;
                player.transform.LookAt(player.transform.position + cameraForward);
            }
        }
    }
    

    以上代码中,player是角色的变换组件,mainCamera是摄像头的变换组件。这段代码会在mode等于3且isMoving为真(在MovingA()中设为真)时运行。

    希望这能帮到你,如果有任何疑问,请随时询问!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月29日