unity实现AI对战坦克
游戏要求
- 使用“感知-思考-行为”模型,建模 AI 坦克
- 场景中要放置一些障碍阻挡对手视线
- 坦克需要放置一个矩阵包围盒触发器,以保证 AI 坦克能使用射线探测对手方位
- AI 坦克必须在有目标条件下使用导航,并能绕过障碍。(失去目标时策略自己思考)
- 实现人机对战
具体实现
参考师兄的博客https://blog.csdn.net/Jenny_Shirunhao/article/details/103337423,Bake生成导航网格图之前的步骤就不赘述了,烘焙效果如下:
为AI坦克添加脚本使其能够跟踪玩家的坦克
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class TrackTarget : MonoBehaviour
{
public GameObject target;
NavMeshAgent nav;
void Start()
{
nav = GetComponent<NavMeshAgent>();
}
void OnTriggerEnter(Collider collider)
{
if (collider.gameObject.tag == "Player")
{
nav.SetDestination(target.transform.position);
}
}
}
AI通过碰撞体的tag来判断是否是玩家,为使上面代码正常运行,需要给AI坦克增加碰撞体,以及将玩家坦克的标签设为Player。
AI坦克还不够多,再在地图上放几个。
使AI坦克发射炮弹
修改Fire_Control_CS的代码如下:
float count = 4.0f;
void Update ()
{
if (idScript.isPlayer) {
#if UNITY_ANDROID || UNITY_IPHONE
Mobile_Input ();
#else
Desktop_Input ();
#endif
}
else
{
count -= Time.deltaTime;
if(count <= 0)
{
Fire();
count = 4.0f;
}
}
}
坦克还不够多,再在地图上放几个。
腹背受敌,要的就是这种感觉。
坦克默认,受到攻击时显示血条,为了时刻能显示玩家的血条,修改Damage_Control_CS代码如下:
if(idScript.isPlayer)
{
displayScript.Get_Damage(durability, initialDurability);
}
// Destruct
if (idScript.isPlayer) {
#if UNITY_ANDROID || UNITY_IPHONE
if (CrossPlatformInputManager.GetButtonDown ("Destruct")) {
#else
if (Input.GetKeyDown (KeyCode.Return)) {
#endif
Start_Destroying ();
}
}
保存运行,看到血条如下:
游戏效果