目标:
统一ai基类
移动ai、武器ai
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/** ai 设计规则
* ai的 onUpdate 接口负责更新ai心跳, 由对应controller脚本驱动,如果ai被销毁(或者碰撞主动销毁自己),controlller移除对应ai引用.
* 所有ai都遵从这个规则,包括移动ai、武器ai、子弹ai.
*
*
*/
public abstract class BaseAI : MonoBehaviour
{
protected bool isStart = false;
/** 初始化ai (必要的引用、数据)
* 数组
* 支持多个不同类型的参数
* 比如 var targetTrans = (Transform)args[0];
*/
public abstract void OnStart(params object[] args);
/** 每帧更新(外界驱动)
*
*/
public virtual void OnUpdate(float deltaTime)
{
if (this.isStart == false) return;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/** 子弹移动ai(数组, 子弹会持有发射源的controller,攻击目标的transform)
* 子弹有个碰撞检测脚本
*/
public class ShootBaseAI : BaseAI
{
//内部属性
//--------------------------------------------------------------------------
// 角色transform
protected Transform roleTrans;
// 武器配置
protected WeaponConfig weaponConf;
// 攻击频率
protected float shootInterval;
// 上次攻击时间
protected float shootDeltaTime;
protected BattleManager battle;
//内部方法
//--------------------------------------------------------------------------
/** 发射子弹
*
*
*/
protected virtual void Shoot()
{
battle.battleDatas.CreateBullet(weaponConf.bulletID);
}
//公开接口
//--------------------------------------------------------------------------
/** 初始化ai (必要的引用、数据)
* 数组
* 支持多个不同类型的参数
* 比如 var targetTrans = (Transform)args[0];
*/
public override void OnStart(params object[] args)
{
battle = GameMgr.instanse.BattleMgr();
this.isStart = true;
}
/** 每帧更新
* 角色 controller 驱动心跳
*/
public override void OnUpdate(float deltaTime)
{
base.OnUpdate(deltaTime);
if (this.shootDeltaTime > this.shootInterval)
{
this.shootDeltaTime = 0f;
this.Shoot();
} else {
this.shootDeltaTime += deltaTime;
}
}
/** 每帧更新
* 角色 controller 驱动心跳
*
* OnUpdateTimeOnly 与 OnUpdate 互斥 , 同一帧只能执行其中一个.
* 比如玩家不滑动角色,角色会更新武器时间,但是不会攻击(即使攻击时间到了).
*
*/
public virtual void OnUpdateTimeOnly(float deltaTime)
{
base.OnUpdate(deltaTime);
this.shootDeltaTime += deltaTime;
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingleShootAI : ShootBaseAI
{
/** 初始化ai (必要的引用、数据)
* 数组
* 支持多个不同类型的参数
* 比如 var targetTrans = (Transform)args[0];
*/
public override void OnStart(params object[] args)
{
if (args == null || args.Length == 0)
{
Debug.LogError("args 必须包含 角色transform、武器配置 ");
return;
}
this.roleTrans = (Transform)args[0];
this.weaponConf = (WeaponConfig)args[1];
base.OnStart();
}
}
移动ai:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SingleForwardAI : BaseAI
{
// 角色transform
Transform roleTrans;
/** 初始化ai (必要的引用、数据)
* 数组
* 支持多个不同类型的参数
* 比如 var targetTrans = (Transform)args[0];
*/
public override void OnStart(params object[] args)
{
if (args == null || args.Length == 0)
{
Debug.LogError("args 必须包含 角色transform ");
return;
}
roleTrans = (Transform)args[0];
this.isStart = true;
}
/** 每帧更新(外界驱动)
*
*/
public override void OnUpdate(float deltaTime)
{
//Debug.Log("single forward deltaTime : " + deltaTime);
//Debug.Log("single forward isStart : " + this.isStart);
//Debug.Log("single forward roleTrans : " + roleTrans.name);
base.OnUpdate(deltaTime);
roleTrans.position += Vector3.down * deltaTime * 0.5f;
}
}