大家好,我是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 物体上,如图:![](https://img-blog.csdn.net/20161220100813644?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemp3MTM0OTU0NzA4MQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
接下来我们需要更多的无人机来测试建造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 或者关注我的公众号: