Files
JJBB/Assets/Project/Script/Obj/Obj_Characters/Obj_ClientNPC.cs

281 lines
10 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
/********************************************************************************
* 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;
}
}
}
}