(三)AI 设计

目标:

统一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 == falsereturn;
    }
}
 

 

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;
    }

}
 

你可能感兴趣的:(游戏开发,ai,英雄大作战)