Project_WL/Assets/Script/Character/WorkerActor.cs

113 lines
3.3 KiB
C#
Raw Normal View History

2025-03-07 02:28:25 +00:00
using UnityEngine;
public class WorkerActor : Actor
{
2025-03-07 04:53:50 +00:00
WorkerListTableData m_WorkerListTableData;
2025-03-07 23:45:34 +00:00
DropItem _finditem;
DropItem go_finditem
{
get { return _finditem; }
set { _finditem = value; isFinditem = _finditem; }
}
bool isFinditem;
2025-03-07 02:28:25 +00:00
float SeekTime = 5f, t;
2025-03-07 04:53:50 +00:00
Actor m_Owner;
bool isOwner;
2025-03-07 02:28:25 +00:00
byte Status = 0; // 0 아이들, 1 캐릭터 뒤로 이동 중, 2 아이템으로 이동 중
public override void Set(bool isEnemy, Actor owner, ServerData sdata, int _id, bool _stop, bool _ui = false)
{
base.Set(isEnemy, owner, sdata, _id, _stop);
m_Role = eRole.Worker;
2025-03-07 04:53:50 +00:00
m_Owner = owner;
isOwner = m_Owner;
2025-03-07 23:45:34 +00:00
m_Stat = new ActorStatInfo(m_Role, sdata, null);
2025-03-07 02:28:25 +00:00
2025-03-07 04:53:50 +00:00
m_WorkerListTableData = table_worker.Ins.Get_Data_orNull(_id);
2025-03-07 02:28:25 +00:00
if (!_ui)
{
2025-03-07 04:53:50 +00:00
int lv = 1; // TODO 정인호 : 일꾼 레벨
m_NavMeshAgent.speed = m_NavSpeed = m_WorkerListTableData.f_MoveSpeed;
t = SeekTime = m_WorkerListTableData.f_SeekTimeDelay;
2025-03-07 02:28:25 +00:00
Set_Warp(Get_Pos());
Status = 0;
}
}
public override void On_Regen(bool reincarnation = false, float healrate = 1)
{
2025-03-07 23:45:34 +00:00
Status = 0;
Set_Warp(Get_Pos());
}
2025-03-07 02:28:25 +00:00
Vector3 Get_Pos()
{
2025-03-07 04:53:50 +00:00
return DSUtil.Get_RandomPos_onNavMesh(m_Owner.Get_position(), 0f, 1f);
2025-03-07 02:28:25 +00:00
}
protected override void Update()
{
t -= Time.deltaTime;
switch (Status)
{
case 0: // 대기 중
2025-03-07 23:45:34 +00:00
if (!isFinditem || !go_finditem.gameObject.activeInHierarchy)
2025-03-07 02:28:25 +00:00
go_finditem = DropItemInfo.Ins.Get_NearestDropItem(Get_position());
2025-03-07 23:45:34 +00:00
if (t <= 0f && go_finditem && Set_Path(go_finditem.transform.position))
2025-03-07 02:28:25 +00:00
{
2025-03-07 23:45:34 +00:00
Play_Run();
Status = 2;
2025-03-07 02:28:25 +00:00
}
2025-03-07 23:45:34 +00:00
if (!isFinditem && Status == 0 && isOwner && Vector3.Distance(m_Owner.Get_position(), Get_position()) > 3f)
{ // 아이템이 없으므로 캐릭터 근처로 옴
2025-03-07 02:28:25 +00:00
Play_Run();
Set_Path(Get_Pos());
Status = 1;
}
break;
case 1: // 캐릭터 뒤로 가는 중
if (Complete_Destination())
{
Play_Idle();
Status = 0;
}
break;
case 2: // 아이템으로 뛰어가는 중
if (CurAnim >= eAnim.Attack)
{
if (!isPlaying())
2025-03-07 23:45:34 +00:00
End_Run();
2025-03-07 02:28:25 +00:00
}
else if (Complete_Destination())
2025-03-07 23:45:34 +00:00
End_Run();
2025-03-07 02:28:25 +00:00
break;
case 3: // 아무것도 안함
if (CurAnim != eAnim.Idle && Complete_Destination())
Play_Idle();
if (t <= 0f)
Status = 0;
break;
}
}
2025-03-07 23:45:34 +00:00
void End_Run()
{
Play_Idle();
Status = 0;
t = SeekTime;
}
private void OnTriggerEnter(Collider other)
{
var dropitem = other.GetComponent<DropItem>();
if (dropitem)
{
dropitem.ItemTouch(this);
if (go_finditem == dropitem)
go_finditem = null;
}
}
2025-03-07 02:28:25 +00:00
}