花了一天的时间,照着官方的说明将spaceshoot这个DEMO撸了一遍,实现了一个简单飞行射击游戏应有的小功能,本想着用Unet这个组件把这个游戏做成一个联网的,无奈只能实现飞机运动之间的同步,其余部分画面都是不同步的。等经过进一步的学习之后我会再把这个DEMO进行完善。
接下来就分析一下这个DEMO的各个游戏对象与组件的关系。
1.场景:这个飞行射击游戏只有需要一个场景,一张用图片来做背景的星空图,一些粒子效果来模拟星星。
2.游戏对象:1.1玩家飞机:用WASD来进行控制,移动有范围限制,鼠标左键开火,撞到子弹,陨石,敌机会爆炸并附带音效;
1.2 陨石:在玩家上方随机生成并向下移动并具有旋转,离开边界范围会自动销毁,被子弹击中会爆炸,撞击到玩家飞机会爆炸并附带音效
1.3 敌机:在玩家上方随机生成并向下移动,并且可以开火,被子弹击中会爆炸,与玩家飞机相撞会爆炸,超出边界范围会销毁
1.4 子弹:可以由玩家和敌机生成,在Z轴上具有一定的速度,遇见玩家,陨石,敌机,进行爆炸并附带音效,超过生命周期会销毁
3.UI界面:需要一个计分板,玩家死亡后的结束游戏提示,和按R重新开始提示
脚本:
3.1玩家控制脚本
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
[System.Serializable]public class Boundary
{
public float xMin,zMin,xMax,zMax;//这是设定玩家运动的边界范围
}
public class playercontroller : MonoBehaviour {
public float speed;//移动速度
public Boundary boundary;//边界
public float tilt = 4;//旋转速度
public float fireRate = 0.2f;//开或延迟
public GameObject shot;//子弹对象
public Transform shotspawn;//子弹生成地点
private float nextfire = 0;//开火间隔
// Use this for initialization
void Update () {
//if (isLocalPlayer) {
if (Input.GetButton ("Fire1") && Time.time > nextfire) {
//按下鼠标左键并且时间大于开火间隔
nextfire = Time.time + fireRate;//更新最近开火时间
Instantiate (shot, shotspawn.position, shotspawn.rotation); //生成子弹对象
GetComponent<AudioSource> ().Play ();//播放射击音效
}
//}
}
// Update is called once per frame
void FixedUpdate () {
//if (isLocalPlayer) {
float moveHorizontal = Input.GetAxis ("Horizontal");//获得水平输入值
float moveVertical = Input.GetAxis ("Vertical");//获得竖直方向上的输入值
Vector3 movement = new Vector3 (moveHorizontal, 0, moveVertical);//定义一个三维变量用于储存玩家进行的移动操作
Rigidbody rb = GetComponent<Rigidbody> ();
if (rb != null) {
rb.velocity = movement * speed;//设定刚体在某方向上的速度
rb.position = new Vector3 (Mathf.Clamp (rb.position.x, boundary.xMin, boundary.xMax), 0, Mathf.Clamp (rb.position.z, boundary.zMin, boundary.zMax));//更新位置,并且处在设定范围内
rb.rotation