281 lines
10 KiB
C#
281 lines
10 KiB
C#
/********************************************************************************
|
||
* 文件名: Obj_ClientNPC.cs
|
||
*
|
||
* 功能说明:客户端表现需要的一些NPC
|
||
* 修改记录:
|
||
*********************************************************************************/
|
||
|
||
|
||
using Games.GlobeDefine;
|
||
using Games.Mission;
|
||
using GCGame.Table;
|
||
using System.Collections;
|
||
using System.Collections.Generic;
|
||
using Module.Log;
|
||
using UnityEngine;
|
||
using Games.Scene;
|
||
using Games.ChatHistory;
|
||
|
||
namespace Games.LogicObj
|
||
{
|
||
public class Obj_ClientNPC_Init_Data : Obj_Character_Init_Data
|
||
{
|
||
public Tab_ClientNPC m_ClientNPC;
|
||
|
||
public Obj_ClientNPC_Init_Data()
|
||
{
|
||
CleanUp();
|
||
}
|
||
public override void CleanUp()
|
||
{
|
||
base.CleanUp();
|
||
m_ClientNPC = null;
|
||
}
|
||
}
|
||
|
||
public class Obj_ClientNPC : Obj_Character
|
||
{
|
||
enum AiState
|
||
{
|
||
None,
|
||
Born,
|
||
Move,
|
||
Moving,
|
||
Action,
|
||
Dialog,
|
||
Fellow,
|
||
}
|
||
|
||
AiState m_aiState = AiState.None;
|
||
public override UIPathData HeadUiPath
|
||
{
|
||
get { return Obj_NPCHeadUI.pathData; }
|
||
}
|
||
|
||
protected Obj_NPCHeadUI m_headUIObj;
|
||
Tab_ClientNPC m_ClientNPC = null;
|
||
protected int m_ObjId;
|
||
protected string m_OwerName;
|
||
string stateString = "";
|
||
private float SwapTime = -1;
|
||
|
||
public override bool Init(ObjParent_Init_Data initData1)
|
||
{
|
||
bool result = base.Init(initData1);
|
||
if (result == false)
|
||
{
|
||
LogModule.ErrorLog("Base Init Failure!");
|
||
return false;
|
||
}
|
||
Obj_ClientNPC_Init_Data initData = initData1 as Obj_ClientNPC_Init_Data;
|
||
if (initData == null)
|
||
return false;
|
||
m_ObjId = initData.m_OwnerObjId;
|
||
m_OwerName = initData.m_OwerName;
|
||
m_ClientNPC = initData.m_ClientNPC;
|
||
if (m_ClientNPC == null)
|
||
return false;
|
||
stateString = m_ClientNPC.StatList;
|
||
Obj_Character ower = Singleton<ObjManager>.Instance.FindObjCharacterInScene(m_ObjId);
|
||
if (ower != null)
|
||
{
|
||
m_aiState = AiState.Fellow;
|
||
BaseAttr.MoveSpeed = ower.BaseAttr.MoveSpeed;
|
||
ObjTransform.position = ower.Position - ower.transform.forward;
|
||
}
|
||
else
|
||
{
|
||
if(m_ClientNPC!=null && m_ClientNPC.MoveSpeed!=-1)
|
||
{
|
||
BaseAttr.MoveSpeed = m_ClientNPC.MoveSpeed;
|
||
}
|
||
else
|
||
{
|
||
Tab_RoleBaseAttr baseAttr = TableManager.GetRoleBaseAttrByID(m_ClientNPC.RoleBaseID, 0);
|
||
if (baseAttr != null)
|
||
{
|
||
BaseAttr.MoveSpeed = baseAttr.MoveSpeed;
|
||
}
|
||
}
|
||
m_aiState = AiState.Born;
|
||
}
|
||
//初始化寻路代理
|
||
InitNavAgent();
|
||
if(m_ClientNPC.IsShowName==1)
|
||
CreateNameBoard();
|
||
CreateModel(ModelID);
|
||
return true;
|
||
}
|
||
|
||
//protected override void CreateModelOver(Hashtable hashParam)
|
||
//{
|
||
// base.CreateModelOver(hashParam);
|
||
// InitAnimation();
|
||
//}
|
||
//
|
||
public override void InitNameBoard(Obj_HeadUI headUiItem)
|
||
{
|
||
base.InitNameBoard(headUiItem);
|
||
m_headUIObj = (Obj_NPCHeadUI)headUiItem;
|
||
if (m_headUIObj == null)
|
||
return;
|
||
m_headUIObj.SetName(BaseAttr.RoleName);
|
||
if(m_ClientNPC != null)
|
||
{
|
||
m_headUIObj.SetNameColor(GCGame.Utils.GetColorByString(m_ClientNPC.NameColor));
|
||
}
|
||
m_headUIObj.beLongObj.SetActive(false);
|
||
m_headUIObj.boardObj.SetActive(false);
|
||
m_headUIObj.OwerNameText.gameObject.SetActive(false);
|
||
m_headUIObj.HideHp(false);
|
||
}
|
||
|
||
AiState GetState(string stateStr,bool DelFirst = false)
|
||
{
|
||
if (string.IsNullOrEmpty(stateString) || stateString.Length<=0)
|
||
return AiState.None;
|
||
char first = stateString[0];
|
||
if (DelFirst)
|
||
stateString = stateString.Remove(0,1);
|
||
if (first == 'A')
|
||
{
|
||
return AiState.Action;
|
||
}
|
||
if (first == 'M')
|
||
{
|
||
return AiState.Move;
|
||
}
|
||
if (first == 'D')
|
||
{
|
||
return AiState.Dialog;
|
||
}
|
||
if (DelFirst)
|
||
stateString = stateString.Remove(0);
|
||
return AiState.None;
|
||
}
|
||
|
||
public override void ShowChatBubble(ChatHistoryItem history)
|
||
{
|
||
if (null != m_headUIObj)
|
||
{
|
||
m_headUIObj.ShowChatBubble(history);
|
||
}
|
||
}
|
||
|
||
protected override void LateUpdate()
|
||
{
|
||
base.LateUpdate();
|
||
if (m_aiState == AiState.None)
|
||
return;
|
||
switch(m_aiState)
|
||
{
|
||
case AiState.Fellow:
|
||
{
|
||
Obj_Character obj = Singleton<ObjManager>.Instance.FindObjCharacterInScene(m_ObjId);
|
||
if (obj == null)
|
||
return;
|
||
if(Vector3.Distance(obj.Position,Position)>=5 && MovementState == MoveState.Static)
|
||
{
|
||
Vector3 den = obj.Position - obj.transform.forward;
|
||
MoveAsMainPlayer(den);
|
||
}
|
||
else
|
||
{
|
||
if(Vector3.Distance(obj.Position, Position) >= 3)
|
||
{
|
||
Vector3 den = obj.Position - obj.transform.forward;
|
||
MoveAsMainPlayer(den);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case AiState.Born:
|
||
{
|
||
m_aiState = GetState(stateString, true);
|
||
SwapTime = -1;
|
||
}
|
||
break;
|
||
case AiState.Move:
|
||
{
|
||
if (m_ClientNPC != null && m_ClientNPC.WalkToPosX != -1 && m_ClientNPC.WakeToPosZ != -1)
|
||
{
|
||
Vector3 den = new Vector3(m_ClientNPC.WalkToPosX, 0, m_ClientNPC.WakeToPosZ);
|
||
MoveAsMainPlayer(ActiveScene.GetTerrainPosition(den));
|
||
}
|
||
m_aiState = AiState.Moving;
|
||
SwapTime = -1;
|
||
}
|
||
break;
|
||
case AiState.Moving:
|
||
{
|
||
if (Vector3.Distance(Position, ServerPos) <= 0.1f && MovementState == MoveState.Static)
|
||
{
|
||
if (m_ClientNPC != null && AnimLogic != null && CurObjAnimState == GameDefine_Globe.OBJ_ANIMSTATE.STATE_NORMOR)
|
||
{
|
||
m_aiState = GetState(stateString, true);
|
||
SwapTime = -1;
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case AiState.Action:
|
||
{
|
||
if (AnimLogic == null)
|
||
return;
|
||
if(m_ClientNPC.ActionID==-1 || m_ClientNPC.ActionTime<=0)
|
||
{
|
||
SwapTime = -1;
|
||
m_aiState = GetState(stateString, true);
|
||
return;
|
||
}
|
||
if(SwapTime==-1)
|
||
{
|
||
AnimLogic.Play(m_ClientNPC.ActionID);
|
||
SwapTime = Time.time + m_ClientNPC.ActionTime;
|
||
}
|
||
else
|
||
{
|
||
if(SwapTime <= Time.time)
|
||
{
|
||
SwapTime = -1;
|
||
CurObjAnimState = GameDefine_Globe.OBJ_ANIMSTATE.STATE_NORMOR;
|
||
m_aiState = GetState(stateString, true);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
case AiState.Dialog:
|
||
{
|
||
if (string.IsNullOrEmpty(m_ClientNPC.DialogText) || m_ClientNPC.DialogText == "-1" || m_ClientNPC.DialogTime <= 0)
|
||
{
|
||
SwapTime = -1;
|
||
m_aiState = GetState(stateString, true);
|
||
return;
|
||
}
|
||
if (SwapTime == -1)
|
||
{
|
||
SwapTime = Time.time + m_ClientNPC.DialogTime;
|
||
Games.ChatHistory.ChatHistoryItem histroy = new Games.ChatHistory.ChatHistoryItem();
|
||
histroy.ChatInfo = m_ClientNPC.DialogText;
|
||
histroy.Duration = m_ClientNPC.DialogTime;
|
||
histroy.EChannel = GC_CHAT.CHATTYPE.CHAT_TYPE_INVALID;
|
||
ShowChatBubble(histroy);
|
||
if(m_ClientNPC.DialogSoundID!=-1)
|
||
{
|
||
GameManager.gameManager.SoundManager.PlaySoundEffect(m_ClientNPC.DialogSoundID);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (SwapTime <= Time.time)
|
||
{
|
||
SwapTime = -1;
|
||
m_aiState = GetState(stateString, true);
|
||
}
|
||
}
|
||
}
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
} |