Files
JJBB/Assets/Project/Script/Obj/Obj_Characters/Obj_ClientNPC.cs
2024-08-23 15:49:34 +08:00

281 lines
10 KiB
C#
Raw 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.

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