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

来源:互联网 发布:勇者之塔祈祷数据 编辑:程序博客网 时间:2024/06/05 04:34

      大家好,我是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  或者关注我的公众号:



1 0