简单坦克大战
作业要求
坦克对战游戏 AI 设计 从商店下载游戏:“Kawaii” Tank 或 其他坦克模型,构建 AI 对战坦克。具体要求
- 使用“感知-思考-行为”模型,建模 AI 坦克
- 场景中要放置一些障碍阻挡对手视线
- 坦克需要放置一个矩阵包围盒触发器,以保证 AI 坦克能使用射线探测对手方位
- AI 坦克必须在有目标条件下使用导航,并能绕过障碍。(失去目标时策略自己思考)
- 实现人机对战
项目地址
具体实现
参考学姐博客,对一些混乱的地方进行了修改。 关于框架的复用不再赘述,主要包括:
- 用工厂处理子弹和电脑坦克;
- 导演,场景控制器;
- IUserGUI接受用户输入;
NavMesh
官方文档 使用NavMesh来控制AI坦克的移动,使用SetDestination将Player设置为目标。
void FixedUpdate () {
if(sceneController.getResult()==0) {
target = sceneController.getPlayerPosition();
if(HP.GetHP() <= 0.0f && recycleEvent != null) {
recycleEvent(this.gameObject);
sceneController.decreaseCountNPC();
}
else {
NavMeshAgent agent = GetComponent<NavMeshAgent>();
agent.SetDestination(target);
}
}
else {
NavMeshAgent agent = GetComponent<NavMeshAgent> ();
agent.velocity = Vector3.zero;
agent.ResetPath();
}
}
血条
学姐使用blood作为基类然后Player和NPC继承blood,bloodcontroller来控制血量,但是bloodcontroller完全没有使用,我将这部分代码重写,把上一次作业制作的预制体UGUI-H-Bar挂到玩家和电脑的坦克上,当子弹碰撞到时扣血即可。
using UnityEngine;
using System.Collections;
using UnityEngine.UI;
public class UGUI_H: MonoBehaviour {
public Slider HPStrip;
public Image fill;
public float HP = 10f;
private float tmpHP;
void Awake() {
HPStrip.value = HPStrip.maxValue = HP;
tmpHP = HP;
fill.color = Color.green;
}
void Update() {
HP = Mathf.Lerp(HP, tmpHP, 0.05f);
HPStrip.value = HP;
if (HP<=5) {
fill.color = Color.red;
}
}
public void SetHP(int flag, float damage) {
if(flag == 1 && HP <= 10) {
tmpHP += damage;
} else if(flag == 0 && HP > 0) {
tmpHP -= damage;
}
}
public float GetHP() {
return HP;
}
}