2023-09-12 14:46:57 +00:00
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using Sirenix.OdinInspector;
|
2023-09-12 07:41:11 +00:00
|
|
|
using UnityEngine;
|
|
|
|
|
|
|
|
// ReSharper disable once CheckNamespace
|
|
|
|
namespace BlueWaterProject
|
|
|
|
{
|
2023-09-13 03:23:27 +00:00
|
|
|
public class PirateAi : CombatAi
|
2023-09-12 07:41:11 +00:00
|
|
|
{
|
2023-09-12 14:46:57 +00:00
|
|
|
#region Properties and variables
|
2023-09-12 07:41:11 +00:00
|
|
|
|
2023-09-12 14:46:57 +00:00
|
|
|
[Title("Skin")]
|
|
|
|
[Tooltip("SkinnedMeshRenderer, MeshRenderer의 Material을 모두 담고 있는 리스트")]
|
|
|
|
[SerializeField] protected List<Material> skinMaterialList = new(10);
|
|
|
|
|
|
|
|
[Tooltip("캐릭터 외곽선의 기본 색상")]
|
|
|
|
[SerializeField] protected Color defaultSkinColor = Color.black;
|
|
|
|
|
|
|
|
[Tooltip("캐릭터에 마우스 커서가 올라가 있을 때 색상")]
|
|
|
|
[SerializeField] protected Color mouseEnterHighlightSkinColor = Color.white;
|
|
|
|
|
|
|
|
[Tooltip("캐릭터가 선택되었을 때 색상")]
|
|
|
|
[SerializeField] protected Color selectedSkinColor = Color.red;
|
|
|
|
|
|
|
|
[DisableIf("@true")]
|
|
|
|
[SerializeField] private IslandInfo islandInfo;
|
|
|
|
|
|
|
|
protected PirateStat pirateStat;
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Unit Built-in methods
|
|
|
|
|
|
|
|
private void Start()
|
|
|
|
{
|
|
|
|
InitStart();
|
|
|
|
}
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
#region Custom methods
|
|
|
|
|
|
|
|
protected override void SetLayer()
|
|
|
|
{
|
|
|
|
gameObject.layer = LayerMask.NameToLayer("Pirate");
|
|
|
|
var hitBoxObj = hitBoxCollider.gameObject;
|
|
|
|
hitBoxObj.layer = LayerMask.NameToLayer("HitBox");
|
|
|
|
hitBoxObj.tag = "Pirate";
|
|
|
|
targetLayer = LayerMask.GetMask("Enemy");
|
|
|
|
|
|
|
|
if (pirateStat.AttackerType == EAttackerType.OFFENSE)
|
|
|
|
{
|
|
|
|
targetLayer |= LayerMask.GetMask("Props");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected virtual void InitStart()
|
|
|
|
{
|
|
|
|
var pirateViewData = GetPirateViewData();
|
|
|
|
|
|
|
|
InitViewModel(pirateViewData);
|
|
|
|
FindMaterial();
|
|
|
|
SetCurrentHp(pirateStat.MaxHp);
|
|
|
|
SetMoveSpeed(pirateStat.MoveSpd);
|
|
|
|
|
|
|
|
if (pirateStat.AttackerType == EAttackerType.DEFENSE)
|
|
|
|
{
|
|
|
|
defensePos = transform.position;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void InitViewModel(PirateView pirateView)
|
|
|
|
{
|
|
|
|
SetActiveViewModel(backpackContainer, pirateView.Backpack);
|
|
|
|
SetActiveViewModel(leftWeaponContainer, pirateView.LeftWeapon);
|
|
|
|
SetActiveViewModel(leftShieldContainer, pirateView.LeftShield);
|
|
|
|
SetActiveViewModel(headContainer, pirateView.Head);
|
|
|
|
SetActiveViewModel(rightWeaponContainer, pirateView.RightWeapon);
|
|
|
|
SetActiveViewModel(bodyContainer, pirateView.Body);
|
|
|
|
SetActiveViewModel(flagContainer, pirateView.Flag);
|
|
|
|
}
|
|
|
|
|
|
|
|
private void FindMaterial()
|
|
|
|
{
|
|
|
|
var skinnedMeshRenderers = GetComponentsInChildren<SkinnedMeshRenderer>();
|
|
|
|
var meshRenderers = GetComponentsInChildren<MeshRenderer>();
|
|
|
|
|
|
|
|
foreach (var skin in skinnedMeshRenderers)
|
|
|
|
{
|
|
|
|
if (!skin.gameObject.activeSelf) continue;
|
|
|
|
|
|
|
|
skinMaterialList.Add(skin.material);
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach (var skin in meshRenderers)
|
|
|
|
{
|
|
|
|
if (!skin.gameObject.activeSelf) continue;
|
|
|
|
|
|
|
|
skinMaterialList.Add(skin.material);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
protected override void SetCurrentHp(float value) => pirateStat.CurrentHp = value;
|
|
|
|
|
|
|
|
private PirateView GetPirateViewData() => Application.isPlaying ?
|
|
|
|
DataManager.Inst.GetPirateViewDictionaryFromKey(pirateStat.ViewIdx) :
|
|
|
|
DataManager.Inst.GetPirateViewSoFromKey(pirateStat.ViewIdx);
|
|
|
|
|
|
|
|
#endregion
|
2023-09-12 07:41:11 +00:00
|
|
|
}
|
|
|
|
}
|