Unity实战 RTS3D即时战略游戏开发(十一) 建造AI、生产AI

      大家好,我是Zander,我们接着来开发Rts3D即时战略游戏开发。这节课我们接着来讲AI的相关部分(建造AI、生产AI)。Ai 要知道如何建造建筑,在拥有足够的钱和无人机就可以创建。例如没有建筑时就应该建造一个,首先进入Scripts中的AI文件夹创建一个CreateBaseAI的脚本,

using UnityEngine;
using System.Collections;

public class CreateBaseAi : AiBehavior {

	private AiSupport support = null;  //获取支持类

	public float Cost = 200;          //建造花费

	public int UnitsPerBase = 5;       //表示一个建筑可以生产多少个单位

	public float RangeFromDrone = 30;   //离单位多远才能创建建筑

	public int TriesPerDrone = 3;       //一个单位要尝试创建多少次才能轮到下个单位

	public GameObject BasePrefab;       //建筑物预设

	public override float GetWeight ()    //获得建造权重
	{
		if (support == null)
			support = AiSupport.GetSupport (gameObject);

		if (support.Player.Credits < Cost || support.Drones.Count == 0)  //判断有足够的钱和无人机
			return 0;

		if (support.CommandBases.Count == 0)  //如果没有建筑,则优先建造建筑
			return 1;

        if (support.CommandBases.Count * UnitsPerBase <= support.Drones.Count)
            return 1;

        return 0;
	}

	public override void Execute ()    //
	{
		Debug.Log ("Creating Base");

		var go = GameObject.Instantiate (BasePrefab);
		go.AddComponent<Player> ().Info = support.Player;

		foreach (var drone in support.Drones) {
			for (int i = 0; i < TriesPerDrone; i++) {
				var pos = drone.transform.position;
				pos += Random.insideUnitSphere * RangeFromDrone;
				pos.y = Terrain.activeTerrain.SampleHeight (pos); //确保在地表之上

				go.transform.position = pos;

				if (RtsManager.Current.IsGameObjectSafeToPlace (go))  //判断是否在可建造的位置
                {
					support.Player.Credits -= Cost;
					return;
				}
			}
		}
             Destroy (go);
	}
}


返回到Unity,把脚本挂载Player 2 Ai 物体上,如图:

接下来我们需要更多的无人机来测试建造AI是否能持续创建建筑,所以我们需要一个生产无人机的AI,在AI文件夹下创建一个CreateDroneAi脚本,编辑如下:

using UnityEngine;
using System.Collections;

public class CreateDronesAi : AiBehavior {

	public int DronesPerBase = 5;   //一个建筑可以供养几个无人机
	public float Cost = 25;         //建筑无人机花费
	private AiSupport support;      //

    /// <summary>
    /// 得到生产无人机权重
    /// </summary>
    /// <returns></returns>
	public override float GetWeight ()  
	{
		if (support == null)
			support = AiSupport.GetSupport (gameObject);

		if (support.Player.Credits < Cost)
			return 0;

		var drones = support.Drones.Count;
		var bases = support.CommandBases.Count;

		if (bases == 0)  //判断是否有生产无人机的建筑
			return 0;

		if (drones >= bases * DronesPerBase) return 0;  //判断无人机总量是否大于建筑可供给的数量

		return 1;

	}

	public override void Execute ()
	{
		Debug.Log (support.Player.Name + " is creating a drone.");

		var bases = support.CommandBases;
		var index = Random.Range (0, bases.Count);
		var commandBase = bases [index];
		commandBase.GetComponent<CreateUnitAction> ().GetClickAction () ();
	}
}

这样我们就完成了自动建造建筑AI和自动生产无人机的AI了。

    好了,这一章就写到这,欢迎大家加入QQ群:280993838  或者关注我的公众号:



  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值