Tanks是Unity官网上的一篇教程,官网链接。我将根据这篇为基础改成多人对战的版本,同时梳理下开发思想。
- 坦克的移动
坦克的移动通过刚体来实现。选中坦克,添加一个Box Colider和Rigidbody组件。通过编辑Box Colider,调整其边框大小使之与坦克模型一致。
为坦克添加一个脚本文件来控制其移动。坦克的移动和旋转都可以通过刚体来实现。所以,我们需要利用GetComponent<Rigidbody>()
方法先获取物体的刚体组件。刚体的velocity
属性可以控制物体的移动,angularVelocity
属性可以控制物体的旋转。我们根据用户的按键捕捉其操作后再判断其运动的方向。
void FixedUpdate()
{
float v = Input.GetAxis("Vertical1");
rigidbody.velocity = transform.forward * v * speed;
float h = Input.GetAxis("Horizontal1");
rigidbody.angularVelocity = transform.up * angleSpeed * h;
}
transform.forward是指当前物体向前移动的方向,等于当前物体的自身坐标系z轴在世界坐标上的指向。transform.up等于当前物体的自身坐标系y轴在世界坐标系上的指向。
2. 子弹的创建与移动
子弹的创建采用一个空对象来实现,在坦克对象下面创建一个空的子对象,并移动到合适的位置,旋转合理的角度。
子弹的实例化将利用这个空对象和一个现成的子弹预制体来实现。
GameObject bullet = GameObject.Instantiate(firePrefab, firePosition.position,firePosition.rotation)
as GameObject;
Rigidbody rb = bullet.GetComponent<Rigidbody>();
rb.velocity = transform.forward * speed;
3.碰撞检测与特效
碰撞检测利用刚体来实现,在子弹的相应脚本代码中实现OnTriggerEnter
方法即可。同时要给刚体设置is trigger属性。
public void OnTriggerEnter(Collider collider)
{ GameObject.Instantiate(effectPrefab,transform.position,transform.rotation);
GameObject.Destroy(this.gameObject);
}
4.视角跟随
视角跟随采用代码来实现,创建一个脚本绑定到摄像机上。在一开始的时候就先计算出摄像机当前的位置与参考物之间的偏移。然后在Update()方法中去维护摄像机的距离即可。
// Use this for initialization
void Start () {
offset = transform.position - player1.position / 2;
}
// Update is called once per frame
void Update () {
transform.position = player1.position / 2 + offset;
}
5.网络部分后续发布