Files
2024-08-23 15:49:34 +08:00

210 lines
5.7 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/********************************************************************************
* 文件名: AIController.cs
* 全路径: \Script\Player\AIController.cs
* 创建人: 李嘉
* 创建时间2013-11-18
*
* 功能说明: 客户端AI控制器负责Obj的AI装载
* AI分为三种AI列表进行管理分别是平时AI战斗AI和死亡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);
}
}
}