先看demo:webgl-demos
完成了移动和瞄准、镜头切换。
一.移动
移动部分使用了对Rigidbody(刚体)的操作,船的运动状态是线性的,所以要模拟出物理的船的移动最好的方法就是操作Rigidbody。
对于Rigidbody,Unity已经给出了物理模拟系统,只要设定阻力和质量就可以了。在这里,我锁定了船体的rigidbody的Y坐标和X轴和Z轴的旋转。
添加了Box Colider来处理和山体的碰撞。
private Rigidbody shipBody; void Start () { shipBody = this.GetComponent<Rigidbody>();//获取Rigidbody组件 } void FixedUpdate () { float h = Input.GetAxis("Horizontal");//获取按键左右(支持摇杆) float v = Input.GetAxis("Vertical");//获取按键前后(支持摇杆) shipBody.AddRelativeForce(new Vector3(0, 0, v * 4), ForceMode.Acceleration);//施加前进后退的力 shipBody.AddRelativeTorque(new Vector3(0,h*(float)0.3,0), ForceMode.Acceleration);//施加扭转力 }
二.瞄准
瞄准部分用了getAxis的方法,在按键控制台里绑定了右摇杆到Mouse X,Mouse Y,这样右摇杆就可以和鼠标一样控制视角了。
主要方法就是把鼠标的移动变为瞄准圈的坐标移动,这个部分直接上代码
float MouseX = Input.GetAxis("Mouse X"); float MouseY = Input.GetAxis("Mouse Y"); if (distance(ship, transform) <= 10000) { oldpos = transform.localPosition; transform.Rotate(0,ship.rotation.y-transform.rotation.y,0); transform.localPosition = (new Vector3(MouseX, 0, MouseY) + transform.localPosition); } else { transform.localPosition = oldpos; }
三.镜头切换
使用Cinemachine做到的平滑切换,创建了vcam1作为近距离的单体跟踪和vcam2作为远距离的光标和船体的跟踪(targetgroup)。在光标近的时候使用船体视角,在光标远的时候切换俯视角。
if (distance(ship, transform) >= 1500&flag==false) { flag = true; cam0.SetActive(false); cam1.SetActive(true); } else if(distance(ship,transform)<=1000&flag==true) { flag = false; cam0.SetActive(true); cam1.SetActive(false); } text.text = MouseX.ToString() + "," + MouseY.ToString()+"("+ship.rotation.y+")" + "(" + ship.rotation.y + ")"; } float distance(Transform a,Transform b) { float distance = 0; distance = Mathf.Pow((a.position.x - b.position.x), 2) + Mathf.Pow((a.position.z - b.position.z), 2); return distance; } }