unity实现简单坦克对战

unity实现简单坦克对战

游戏要求

  • 使用“感知-思考-行为”模型,建模 AI 坦克
  • 场景中要放置一些障碍阻挡对手视线
  • 坦克需要放置一个矩阵包围盒触发器,以保证 AI 坦克能使用射线探测对手方位
  • AI 坦克必须在有目标条件下使用导航,并能绕过障碍。(失去目标时策略自己思考)
  • 实现人机对战

实现过程

首先先从资源商店下载坦克模型,本次采用的是“Kawaii” Tank。
unity实现简单坦克对战_第1张图片
将该包导入后,还需要导入standard assets中的CrossPlatformInput,
unity实现简单坦克对战_第2张图片
将“Kawaii” Tank,Scenes里面的Test_Field作为场景。
unity实现简单坦克对战_第3张图片
该场景初始有一辆玩家的坦克和一辆敌方的坦克,还有两幢小房子,为了增加游戏的丰富度和趣味性,我们增加几幢小房子和几辆敌方坦克。
unity实现简单坦克对战_第4张图片
将所有房子Navigation->object中的Navigation Area设置为Not Walkerable,将地面Navigation->object中的Navigation Area设置为Walkerable,这是为了下一步坦克能够顺利自动寻路做铺垫。
unity实现简单坦克对战_第5张图片

实现敌方坦克自动寻路

为所有敌方坦克的main body添加Nav Mesh Agent组件,用于游戏对象的导航。
unity实现简单坦克对战_第6张图片
选择 Navgation 的 Bake 面板,点击下方 Bake 按钮,即会根据可行走区域生成导航网格。
unity实现简单坦克对战_第7张图片
为了使敌方坦克能够追踪目标,需要为其添加脚本,并将玩家的坦克作为target。先添加玩家的坦克标签为Player,
在这里插入图片描述
再为所有敌方坦克添加Box Collider组件,勾选Is Trigger选项,作为触发器,并设置好触发器的大小范围后,当玩家坦克进入敌方坦克范围时,会触发相应事件。
unity实现简单坦克对战_第8张图片
编写代码如下,代码很简单,就是当敌方坦克检测到玩家时,会自动导航至玩家所在的位置。

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

unity实现简单坦克对战_第9张图片
unity实现简单坦克对战_第10张图片

项目地址
视频链接

你可能感兴趣的:(Objective-C)