利用人物控制器实现物体移动碰撞以及视角的转动

    先给你需要移动的物体添加组建CharacterContorller//人物控制器,接着在代码中先获取人物控制器组建

private CharacterController chara;

void Start () {
        chara=GetComponent<CharacterController>();
    }

然后在Update方法中,定义水平和竖直坐标轴   float Z = Input.GetAxis("Vertical") * 0.1f;   float X = Input.GetAxis("Horizontal") * 0.1f;

创建三维坐标Vector3,把X与Z传到Vector3中  Vector3 v3 = new Vector3(X,0,Z);  设置物体斜角移动是的方向 v3 = Vector3.ClampMagnitude(v3,0.1f);
  并且将本地坐标转换为世界坐标轴   v3 = transform.TransformDirection(v3);

最后利用定义好的人物控制器对象获取编写好的三维坐标执行移动  chara.Move (v3);

因为人物控制器与刚体间有冲突,所以当你添加了人物控制器,刚体组建则会无效,这时刚体组建中的重力效果就无法运用,我们需要模拟重力来代替刚体组建中的重力效果;

chara.SimpleMove (v3);//模拟重力 ;

人物的跳跃:判断当你按下空格键的时候,你获得一个向上的力,然后执行三维坐标的移动  if(Input.GetKey(KeyCode.Space)){ v3.y = 1.0f;chara.Move (v3);}

将移动物体的 Is Trigger 和其他物体的 Is trigger 都取消勾选则物体会实现碰撞;

视角的转动:把场景中的主摄像机放到移动的物体上,让它能够跟随物体移动,接下来是相机中代码的部分;

先定义枚举旋转坐标

public enum RotationAxis
 {
  X=1,Y=2,XandY
 }

public RotationAxis axis=RotationAxis.X;//定义鼠标水平移动

还需定义我们刚开始旋转角度为0,private float rotatX = 0;

接下来在Update方法中进行判断

当你鼠标为水平移动时获取你水平移动的坐标并且进行旋转,也就是显示鼠标水平旋转

if (axis == RotationAxis.X) {
   transform.Rotate (0, Input.GetAxis ("Mouse X"), 0);
  }

transform.Rotate旋转时的组建, Input.GetAxis ("Mouse X") 获取鼠标水平移动的坐标;

否则,判断鼠标是否为Y轴方向移动

else if (axis == RotationAxis.Y) {
   rotatX -= Input.GetAxis ("Mouse Y") * speed;
   rotatX = Mathf.Clamp (rotatX, min, max);//设置你旋转的最大最小范围

   float rotationY = transform.localEulerAngles.y; //当你鼠标沿Y轴方向移动时,也就是摄像机竖直移动时,保证Y轴角度不会变化

   transform.localEulerAngles = new Vector3 (rotatX, rotationY, 0);
  } else {//这一部分为摄像机四个方向均可动移动

//获取水平方向鼠标移动
   rotatX -= Input.GetAxis ("Mouse Y") * speed;
   rotatX = Mathf.Clamp (rotatX, min, max);

//XY均可移动

   float Y = Input.GetAxis ("Mouse X") * speed;
   float rotationY = transform.localEulerAngles.y + Y;

   transform.localEulerAngles = new Vector3 (rotatX, rotationY, 0);
  }

当摄像头移动代码完成后将它拖入摄像机和移动物体中去,并且进行设置

在物体上设置只允许水平移动视角

在摄像机上设置只允许竖直移动视角




猜你喜欢

转载自blog.csdn.net/qq_27748027/article/details/76804921