先看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;
}
}

