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);
}
游戏运行截图

在这里插入图片描述
在这里插入图片描述

项目地址
视频链接
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值