/******************************************************************************** * 文件名: 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.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.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; } } } }