You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
283 lines
8.4 KiB
283 lines
8.4 KiB
using DG.Tweening;
|
|
using DG.Tweening.Core;
|
|
using DG.Tweening.Plugins.Options;
|
|
using Spine.Unity;
|
|
using UnityEngine;
|
|
using UnityEngine.AddressableAssets;
|
|
using UnityEngine.ResourceManagement.AsyncOperations;
|
|
using AnimationState = Spine.AnimationState;
|
|
|
|
public class IVPet : MonoBehaviour
|
|
{
|
|
[SerializeField]
|
|
private Transform trfTarget;
|
|
[SerializeField]
|
|
private float fMoveSpeed = 0.1f;
|
|
[SerializeField]
|
|
private Vector3 v3Offset = Vector3.zero;
|
|
private Vector3 v3OffsetRev = Vector3.zero;
|
|
private Vector3 v3posto;
|
|
private Vector3 v3RandomPos;
|
|
private Vector3 v3dir;
|
|
|
|
private SkeletonAnimation skAnim;
|
|
|
|
private TweenerCore<Vector3, Vector3, VectorOptions> twcSummon = null;
|
|
private TweenerCore<Vector3, Vector3, VectorOptions> twcSummonRev = null;
|
|
private TweenerCore<Vector3, Vector3, VectorOptions> twcUnsummon = null;
|
|
private TweenerCore<Vector3, Vector3, VectorOptions> twcUnsummonRev = null;
|
|
private TweenerCore<Vector3, Vector3, VectorOptions> twcMove = null;
|
|
private TweenerCore<Vector3, Vector3, VectorOptions> twcMoveX = null;
|
|
|
|
private int Key = -1;
|
|
private bool bFrontRight = true;
|
|
|
|
private bool bInitNeed = true;
|
|
[SerializeField]
|
|
private bool bSet = true;
|
|
private bool bMove = false;
|
|
private bool bMoveFlag = false;
|
|
private bool bSummoning = false;
|
|
|
|
private AnimationState anState;
|
|
private AsyncOperationHandle<SkeletonDataAsset> handlePet;
|
|
|
|
public void Init()
|
|
{
|
|
Transform trfwrapper = transform.GetChild(0);
|
|
Transform trfpet = trfwrapper.GetChild(0);
|
|
skAnim = trfpet.GetComponent<SkeletonAnimation>();
|
|
twcSummon = transform.DOScale(Global.V3_1, 0.2f).ChangeStartValue(Global.V3_001).SetEase(Ease.OutQuad).OnComplete(SummonEnd).SetAutoKill(false).Pause();
|
|
twcSummonRev = transform.DOScale(Global.V3_1XRev, 0.2f).ChangeStartValue(Global.V3_001XRev).SetEase(Ease.OutQuad).OnComplete(SummonEnd).SetAutoKill(false).Pause();
|
|
twcUnsummon = transform.DOScale(Global.V3_001, 0.2f).ChangeStartValue(Global.V3_1).SetEase(Ease.InQuad).OnComplete(UnsummonEnd).SetAutoKill(false).Pause();
|
|
twcUnsummonRev = transform.DOScale(Global.V3_001XRev, 0.2f).ChangeStartValue(Global.V3_1XRev).SetEase(Ease.InQuad).OnComplete(UnsummonEnd).SetAutoKill(false).Pause();
|
|
transform.position = trfTarget.position + Random.insideUnitSphere * Random.Range(5, 7);
|
|
|
|
bInitNeed = false;
|
|
}
|
|
|
|
#region Summon
|
|
// 펫 소환 완료.
|
|
private void SummonEnd()
|
|
{
|
|
twcMove.Play();
|
|
twcMoveX.Play();
|
|
bSummoning = false;
|
|
}
|
|
|
|
// 펫 소환 해제 완료.
|
|
private void UnsummonEnd()
|
|
{
|
|
gameObject.SetActive(false);
|
|
}
|
|
|
|
// 펫 소환.
|
|
public void Summon()
|
|
{
|
|
if (Key < 0)
|
|
return;
|
|
v3RandomPos = Random.insideUnitCircle * Random.Range(3, 5);
|
|
transform.position = new Vector3(trfTarget.position.x + v3RandomPos.x, trfTarget.position.y + v3RandomPos.y, (trfTarget.position.y + v3RandomPos.y)*0.1f);
|
|
|
|
if (bFrontRight)
|
|
twcSummon.Restart();
|
|
else
|
|
twcSummonRev.Restart();
|
|
gameObject.SetActive(true);
|
|
anState = skAnim.AnimationState;
|
|
if (bSet)
|
|
{
|
|
bMove = false;
|
|
anState.SetAnimation(0, "idle", true);
|
|
}
|
|
}
|
|
|
|
// 펫 소환 해제.
|
|
public void Unsummon()
|
|
{
|
|
if (Key < 0)
|
|
return;
|
|
|
|
bSummoning = true;
|
|
twcMove.Pause();
|
|
twcMoveX.Pause();
|
|
if (bFrontRight)
|
|
twcUnsummon.Restart();
|
|
else
|
|
twcUnsummonRev.Restart();
|
|
}
|
|
|
|
// 펫 끄기.
|
|
public void OffPet()
|
|
{
|
|
twcMove.Pause();
|
|
twcMoveX.Pause();
|
|
gameObject.SetActive(false);
|
|
}
|
|
#endregion Summon
|
|
|
|
|
|
#region Set
|
|
public bool IsPetOn()
|
|
{
|
|
return Key >= 0;
|
|
}
|
|
|
|
public void SetPet(int key)
|
|
{
|
|
// 변경사항 없음.
|
|
if (key == Key)
|
|
return;
|
|
|
|
// 펫 없음.
|
|
if (key < 0)
|
|
{
|
|
if (Key >= 0)
|
|
{
|
|
Key = -1;
|
|
bSet = false;
|
|
if (skAnim.skeletonDataAsset != null)
|
|
skAnim.skeletonDataAsset.Clear();
|
|
skAnim.ClearState();
|
|
gameObject.SetActive(false);
|
|
}
|
|
return;
|
|
}
|
|
|
|
// 펫 있음.
|
|
Key = key;
|
|
bSet = false;
|
|
CoverCamera.Hold();
|
|
if (skAnim.skeletonDataAsset != null)
|
|
skAnim.skeletonDataAsset.Clear();
|
|
skAnim.ClearState();
|
|
|
|
//@ for test
|
|
switch (key)
|
|
{
|
|
case 33:
|
|
key = 44;
|
|
break;
|
|
}
|
|
Addressables.LoadAssetAsync<SkeletonDataAsset>(FormatString.StringFormat(AddressableMgr.PathPet, key.ToString())).Completed += ALoadPetComp;
|
|
}
|
|
#endregion Set
|
|
|
|
|
|
#region Position
|
|
protected void LateUpdate()
|
|
{
|
|
if (bInitNeed || bSummoning)
|
|
return;
|
|
|
|
// = trfTarget.position;
|
|
|
|
// 거리가 5이상 멀어지고, 이동이 불가능한 상태면 다음 위치 할당 후 MoveFlag를 true로 변경
|
|
if (BattleMgr.SCalcDistance(trfTarget.position, transform.position) > 4 && !bMoveFlag)
|
|
{
|
|
if (bFrontRight)
|
|
{
|
|
v3RandomPos = Random.insideUnitCircle * Random.Range(3, 5);
|
|
bMoveFlag = true;
|
|
anState.SetAnimation(0, "move", true);
|
|
}
|
|
else
|
|
{
|
|
v3RandomPos = Random.insideUnitCircle * Random.Range(3, 5); //trfTarget.position + v3OffsetRev;
|
|
bMoveFlag = true;
|
|
anState.SetAnimation(0, "move", true);
|
|
}
|
|
|
|
v3RandomPos.y = Mathf.Clamp(v3RandomPos.y, v3RandomPos.y, 0);
|
|
}
|
|
|
|
// MoveFlag가 true면 이동 시작
|
|
if(bMoveFlag)
|
|
{
|
|
if (bSet)
|
|
{
|
|
v3posto = new Vector3(trfTarget.position.x + v3RandomPos.x,trfTarget.position.y + v3RandomPos.y, (trfTarget.position.y + v3RandomPos.y) * 0.1f);
|
|
v3dir = (v3posto - transform.position).normalized;
|
|
transform.position = transform.position + v3dir * (0.1f * fMoveSpeed); // Vector3.Lerp(transform.position, v3posto, fSmoothSpeed);
|
|
float fdistance = BattleMgr.SCalcDistance(transform.position, v3posto);
|
|
ChangeFrontToTarget();
|
|
if (fdistance <= 1.3f && bMove)
|
|
{
|
|
bMove = false;
|
|
bMoveFlag = false;
|
|
anState.SetAnimation(0, "idle", true);
|
|
}
|
|
|
|
if (fdistance > 1.3f && !bMove)
|
|
{
|
|
bMove = true;
|
|
anState.SetAnimation(0, "move", true);
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// 바라보는 방향 및 위치 초기화.
|
|
public void SetFront(bool bfrontright)
|
|
{
|
|
bFrontRight = bfrontright;
|
|
if (bFrontRight)
|
|
{
|
|
transform.localScale = Global.V3_1;
|
|
transform.position = trfTarget.position + v3Offset;
|
|
}
|
|
else
|
|
{
|
|
transform.localScale = Global.V3_1XRev;
|
|
transform.position = trfTarget.position + v3OffsetRev;
|
|
}
|
|
}
|
|
|
|
// 바라보는 방향 변경.
|
|
public void ChangeFront(bool bfrontright)
|
|
{
|
|
if (bfrontright == bFrontRight)
|
|
return;
|
|
bFrontRight = bfrontright;
|
|
if (bFrontRight)
|
|
transform.localScale = Global.V3_1;
|
|
else
|
|
transform.localScale = Global.V3_1XRev;
|
|
}
|
|
public void ChangeFrontToTarget()
|
|
{
|
|
if (transform.position.x - v3posto.x < -0.1f)
|
|
transform.localScale = Global.V3_1;
|
|
else if (transform.position.x - v3posto.x > 0.1f)
|
|
transform.localScale = Global.V3_1XRev;
|
|
else
|
|
return;
|
|
}
|
|
#endregion Position
|
|
|
|
|
|
#region Addressable
|
|
private void ALoadPetComp(AsyncOperationHandle<SkeletonDataAsset> obj)
|
|
{
|
|
skAnim.skeletonDataAsset = obj.Result;
|
|
skAnim.Initialize(true);
|
|
anState = skAnim.AnimationState;
|
|
//AtlasUtilities.ClearCache();
|
|
|
|
if (handlePet.IsValid())
|
|
{
|
|
Addressables.Release(handlePet);
|
|
AddressableMgr.SAddUnload();
|
|
}
|
|
|
|
handlePet = obj;
|
|
CoverCamera.Release();
|
|
bSet = true;
|
|
|
|
if (BattleMgr.Instance.BattlePause)
|
|
return;
|
|
Summon();
|
|
}
|
|
#endregion Addressable
|
|
}
|