unity实现简单坦克对战
作者:互联网
unity实现简单坦克对战
游戏要求
- 使用“感知-思考-行为”模型,建模 AI 坦克
- 场景中要放置一些障碍阻挡对手视线
- 坦克需要放置一个矩阵包围盒触发器,以保证 AI 坦克能使用射线探测对手方位
- AI 坦克必须在有目标条件下使用导航,并能绕过障碍。(失去目标时策略自己思考)
- 实现人机对战
实现过程
首先先从资源商店下载坦克模型,本次采用的是“Kawaii” Tank。
将该包导入后,还需要导入standard assets中的CrossPlatformInput,
将“Kawaii” Tank,Scenes里面的Test_Field作为场景。
该场景初始有一辆玩家的坦克和一辆敌方的坦克,还有两幢小房子,为了增加游戏的丰富度和趣味性,我们增加几幢小房子和几辆敌方坦克。
将所有房子Navigation->object中的Navigation Area设置为Not Walkerable,将地面Navigation->object中的Navigation Area设置为Walkerable,这是为了下一步坦克能够顺利自动寻路做铺垫。
实现敌方坦克自动寻路
为所有敌方坦克的main body添加Nav Mesh Agent组件,用于游戏对象的导航。
选择 Navgation 的 Bake 面板,点击下方 Bake 按钮,即会根据可行走区域生成导航网格。
为了使敌方坦克能够追踪目标,需要为其添加脚本,并将玩家的坦克作为target。先添加玩家的坦克标签为Player,
再为所有敌方坦克添加Box Collider组件,勾选Is Trigger选项,作为触发器,并设置好触发器的大小范围后,当玩家坦克进入敌方坦克范围时,会触发相应事件。
编写代码如下,代码很简单,就是当敌方坦克检测到玩家时,会自动导航至玩家所在的位置。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public class PlaceTarget : 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);
}
}
}
将该脚本拖到每个敌方坦克中,此时若玩家进入到了敌方坦克范围,坦克就可以进行追踪。而若玩家逃出该范围,坦克便会呆在原地。
使坦克发射炮弹
修改Fire_Control_CS的代码,让敌方坦克也能发射炮弹:
private float i = 0;
private float time = 5f;
void Update ()
{
if (idScript.isPlayer) {
#if UNITY_ANDROID || UNITY_IPHONE
Mobile_Input ();
#else
Desktop_Input ();
#endif
} else
{
i += Time.deltaTime;
if(i >= time)
{
Fire();
i = 0;
}
}
}
为了时刻显示玩家的血条,并只有在攻击后才能看到敌方的血条。修改Damage_Control_CS代码如下:
void Update ()
{
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 ();
}
}
}
由于敌方坦克在没有检测到玩家时并不会移动,而发射炮弹会受到后坐力的影响,因此还需要修改Fire_Control_CS中的代码,后坐力修改如下:
if (idScript.isPlayer) {
bodyRigidbody.AddForceAtPosition (-thisTransform.forward * recoilForce * 0.1f, thisTransform.position, ForceMode.Impulse);
}
游戏运行截图
项目地址
视频链接
标签:void,UNITY,idScript,玩家,对战,unity,坦克,敌方 来源: https://blog.csdn.net/weixin_43847600/article/details/112055048