我在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,但是角色就是不会转向,我试了很多方法,有时候可以转向了,镜头和角色疯狂抽搐晃动,于是有了下图

给那两个都插值了(用GPT写的),结果角色它围绕着世界坐标,移动一点马上回到0,0,0的位置。然后几天没动
我希望的效果是:if模式==3时,其下if(isMoing==true时)则让摄像头的正面与角色的正面一致。