游戏设计好,思考使用什么资源后,需要思考开发的具体功能。以下是个人总结的几个比较重要的思考点。
游戏镜头
由于设计是单机双人的游戏,镜头跟随效果不能是平时简单的跟随单物体移动,而是要在两个物体的重心。并且,两个物体在独立移动时,两者的距离会发生较大的变化,在同样的程序窗口上显示画面,两者距离变近时,相机应当变近,两者距离变远后,相机也应该跟着变远。
public Transform p1; //玩家1的坐标
public Transform p2; //玩家2的坐标
private Vector3 offset; //用于计算坐标位置补偿值
private Camera ca;
float distance = 0;
float size = 0;
// Start is called before the first frame update
void Start()
{
offset = transform.position - (p1.position + p2.position) / 2; //计算相机初始位置与两个玩家中心点的偏移量
ca = this.GetComponent<Camera>(); //初始化相机
}
// Update is called once per frame
void Update()
{
if (p1 == null || p2 == null)
{
return; //当有一方坦克销毁时,不再进行相机运算
}
transform.position = (p1.position + p2.position) / 2 + offset; //相机保持偏移,位于两个玩家正中心
//下面代码用于计算相机缩放比,0.62f是经过我自己摆放相机位置得出的一个看起来比较舒服的比例
distance = Vector3.Distance(p1.position, p2.position);
size = distance * 0.62f;
ca.orthographicSize = size;
}
预制体的使用
双人对战,场景中会有两辆坦克,为了简化开发过程,可以首先把一个坦克模型建立好,为其增添好如刚体插件、脚本等内容,作为一个预制体。再通过预制体实例化出两个不同的实体坦克,分别对其进行编辑。
通过预制体创建的两个实例
键盘操作映射
双人对战,场景中就会有两辆坦克,就要对应两套不同的键盘操作。
为两个玩家设置两套不同的虚拟轴
子弹飞行
子弹射出坦克后,本身就成为一个实体,该实体拥有独立的碰撞检测,并且在碰撞后产生爆炸效果,如果碰撞的是坦克,则造成伤害。
public GameObject shellExpPrefab; //子弹预制体
public AudioClip shellExpAudio; //子弹爆炸音效
public void OnTriggerEnter(Collider other) //当子弹遭遇碰撞时触发该代码
{
AudioSource.PlayClipAtPoint(shellExpAudio, transform.position); //产生爆炸音效
GameObject.Destroy(this.gameObject); //销毁子弹自身
GameObject.Instantiate(shellExpPrefab, transform.position, transform.rotation); //播放爆炸动画
if(other.tag == "Tank") //如果与坦克发生碰撞,将碰撞信息传递给坦克,告诉坦克触发受伤代码
{
other.SendMessage("injury");
}
}
设计框架图
游戏结束UI界面
UI布局如下,并将其初始显示状态设置为不显示
using UnityEngine.SceneManagement; //使用最新的SceneManagement的函数需要用这个库
//再玩一次按钮功能代码
public void ReStartGame()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
//退出游戏按钮功能代码
public void ExitGame()
{
Application.Quit();
}