Files
JJBB/Assets/Project/Script/Player/AI/AIController.cs

210 lines
5.7 KiB
C#
Raw Permalink Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* AIController.cs
* \Script\Player\AIController.cs
*
* 2013-11-18
*
* AI控制器Obj的AI装载
* AI分为三种AI列表进行管理AIAI和死亡AI
* AI的切换接口为
* :Normal.AI
* :Normal.AI->Combat.AI
* :Combat.AI->Normal.AI
* Combat.AI or Normal.AI->Dead.AI
* :Dead.AI->Normal.AI
*
*********************************************************************************/
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using Games.GlobeDefine;
using Games.LogicObj;
namespace Games.AI_Logic
{
public class AIController : MonoBehaviour
{
//NPC非战斗AI
private BaseAI m_NormalAI = null;
public BaseAI NormalAI
{
get { return m_NormalAI; }
set
{
if (null != m_NormalAI)
{
m_NormalAI.Destroy();
}
m_NormalAI = value;
}
}
//NPC战斗AI
private BaseAI m_CombatAI = null;
public BaseAI CombatAI
{
get { return m_CombatAI; }
set
{
if (null != m_CombatAI)
{
m_CombatAI.Destroy();
}
m_CombatAI = value;
}
}
//NPC死亡AI
private BaseAI m_DeadAI = null;
public BaseAI DeadAI
{
get { return m_DeadAI; }
set
{
if (null != m_DeadAI)
{
m_DeadAI.Destroy();
}
m_DeadAI = value;
}
}
//当前NPC状态
private BaseAI m_CurrentAIState = null;
public BaseAI CurrentAIState
{
get { return m_CurrentAIState; }
set { m_CurrentAIState = value; }
}
//标记位
//private bool m_bAliveFlag = true; //是否死亡标记位
//private bool m_bCombatFlag; //是否战斗标记位
public bool CombatFlag { get; set; }
//private bool m_bRestFlag = false; //是否正在进行复位操作
//////////////////////////////////////////////////////////////////////////
//战斗AI相关
//////////////////////////////////////////////////////////////////////////
private Threat m_ThreadInfo;
public Threat ThreadInfo
{
get { return m_ThreadInfo; }
set { m_ThreadInfo = value; }
}
//初始化AI Controller操作
void Awake()
{
//m_bAliveFlag = true;
CombatFlag = false;
//m_bRestFlag = false;
if (null == ThreadInfo)
{
ThreadInfo = new Threat();
}
}
private void Update()
{
if (null == m_CurrentAIState)
m_CurrentAIState = m_NormalAI;
if (null != m_CurrentAIState)
m_CurrentAIState.UpdateAI();
}
//切换AI
public void SwitchCurrentAI(BaseAI ai)
{
if (null != m_CurrentAIState)
{
m_CurrentAIState.OnDeactive();
}
m_CurrentAIState = ai;
if (null != m_CurrentAIState)
{
//重置Threat
if (m_CurrentAIState.AIStateType != CharacterDefine.AI_STATE_TYPE.AI_STATE_COMBAT)
{
m_ThreadInfo.ResetAllThreat();
}
m_CurrentAIState.OnActive();
}
}
//初始化
//进入战斗
public void EnterCombat()
{
CombatFlag = true;
SwitchCurrentAI(m_CombatAI);
}
//离开战斗
public void LeaveCombat()
{
CombatFlag = false;
SwitchCurrentAI(m_NormalAI);
}
//复活
public void OnAlive()
{
CombatFlag = false;
//m_bAliveFlag = true;
SwitchCurrentAI(m_NormalAI);
}
//死亡
public void OnDie()
{
CombatFlag = false;
//m_bAliveFlag = false;
SwitchCurrentAI(m_DeadAI);
}
//Obj复位操作
public void OnRest(bool bFlag)
{
//m_bRestFlag = bFlag;
m_ThreadInfo.ResetAllThreat();
}
//根据AI类型添加
public bool AddAIByStateType(BaseAI ai)
{
switch (ai.AIStateType)
{
case CharacterDefine.AI_STATE_TYPE.AI_STATE_NORMAL:
{
NormalAI = ai;
return true;
}
case CharacterDefine.AI_STATE_TYPE.AI_STATE_COMBAT:
{
CombatAI = ai;
return true;
}
case CharacterDefine.AI_STATE_TYPE.AI_STATE_DEAD:
{
DeadAI = ai;
return true;
}
default:
break;
}
return false;
}
public int GetThreatValue(Obj_Character objCharacter)
{
return ThreadInfo.GetThreatValue(objCharacter);
}
}
}