디졸브 로직 변경, 보스별로 디졸브 효과 추가
This commit is contained in:
parent
9600505116
commit
da427f4ca3
@ -4137,11 +4137,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: -200
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: -50
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
@ -6595,11 +6595,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: 170
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: 30
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
@ -10755,11 +10755,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: 100
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: 30
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
@ -11816,11 +11816,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: -200
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: -120
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
@ -15485,11 +15485,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: 30
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: 30
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
- target: {fileID: 3997465226346976133, guid: b7ec42093fecf23439afbcf6ebd755db, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
@ -18564,11 +18564,11 @@ PrefabInstance:
|
|||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.x
|
propertyPath: m_LocalPosition.x
|
||||||
value: 0
|
value: -200
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.y
|
propertyPath: m_LocalPosition.y
|
||||||
value: 0
|
value: 20
|
||||||
objectReference: {fileID: 0}
|
objectReference: {fileID: 0}
|
||||||
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
- target: {fileID: 6818895542156988354, guid: 7e26271972658154fa0725b5a06a9d0f, type: 3}
|
||||||
propertyPath: m_LocalPosition.z
|
propertyPath: m_LocalPosition.z
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using BlueWater.Interfaces;
|
using System.Collections;
|
||||||
|
using BlueWater.Interfaces;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
|
||||||
@ -78,6 +79,32 @@ namespace BlueWater.Enemies.Bosses
|
|||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
#region Methods
|
#region Methods
|
||||||
|
|
||||||
|
protected override IEnumerator DissolveCoroutine(float start, float end, float dissolveTime)
|
||||||
|
{
|
||||||
|
if (!IsDissolveActive)
|
||||||
|
{
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, end);
|
||||||
|
SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, start);
|
||||||
|
SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
while (elapsedTime <= dissolveTime)
|
||||||
|
{
|
||||||
|
var value = Mathf.Lerp(start, end, elapsedTime / dissolveTime);
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
||||||
|
SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, end);
|
||||||
|
SpriteRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
}
|
||||||
|
|
||||||
private void FlipVisualLook()
|
private void FlipVisualLook()
|
||||||
{
|
{
|
||||||
|
@ -1,8 +1,10 @@
|
|||||||
using BehaviorDesigner.Runtime;
|
using System.Collections;
|
||||||
|
using BehaviorDesigner.Runtime;
|
||||||
using BlueWater.Interfaces;
|
using BlueWater.Interfaces;
|
||||||
using Pathfinding;
|
using Pathfinding;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
|
using UnityEngine.Serialization;
|
||||||
|
|
||||||
namespace BlueWater.Enemies.Bosses
|
namespace BlueWater.Enemies.Bosses
|
||||||
{
|
{
|
||||||
@ -76,6 +78,19 @@ namespace BlueWater.Enemies.Bosses
|
|||||||
|
|
||||||
public IAstarAI AstarAi;
|
public IAstarAI AstarAi;
|
||||||
protected MaterialPropertyBlock MaterialPropertyBlock;
|
protected MaterialPropertyBlock MaterialPropertyBlock;
|
||||||
|
|
||||||
|
[Title("디졸브 스폰 효과")]
|
||||||
|
[SerializeField]
|
||||||
|
protected bool IsDissolveActive = true;
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
protected float SpawnDissolveTime = 2f;
|
||||||
|
|
||||||
|
[SerializeField]
|
||||||
|
protected float DieDissolveTime = 1f;
|
||||||
|
|
||||||
|
// Hashes
|
||||||
|
protected static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -150,6 +165,7 @@ namespace BlueWater.Enemies.Bosses
|
|||||||
|
|
||||||
// Abstract methods
|
// Abstract methods
|
||||||
public virtual void Initialize() { }
|
public virtual void Initialize() { }
|
||||||
|
protected abstract IEnumerator DissolveCoroutine(float start, float end, float dissolveTime);
|
||||||
|
|
||||||
protected abstract void Die();
|
protected abstract void Die();
|
||||||
|
|
||||||
|
@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
public BoomBarrelData BoomBarrelData { get; private set; }
|
public BoomBarrelData BoomBarrelData { get; private set; }
|
||||||
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
||||||
|
|
||||||
[Title("효과")]
|
|
||||||
[SerializeField]
|
|
||||||
private float _spawnDissolveTime = 2f;
|
|
||||||
|
|
||||||
[SerializeField]
|
|
||||||
private float _dieDissolveTime = 1f;
|
|
||||||
|
|
||||||
// Hashes
|
|
||||||
private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -78,26 +68,10 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
BossHealthPoint.Initialize(true, BossData.MaxHealthPoint,
|
BossHealthPoint.Initialize(true, BossData.MaxHealthPoint,
|
||||||
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
|
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
|
||||||
BossSkillController.Initialize(BossData.SkillDataList);
|
BossSkillController.Initialize(BossData.SkillDataList);
|
||||||
|
|
||||||
yield return null;
|
|
||||||
|
|
||||||
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
|
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _spawnDissolveTime)
|
|
||||||
{
|
|
||||||
if (CurrentHealthPoint == 0) yield break;
|
|
||||||
|
|
||||||
var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
BehaviorTree.EnableBehavior();
|
BehaviorTree.EnableBehavior();
|
||||||
HitBoxCollider.enabled = true;
|
HitBoxCollider.enabled = true;
|
||||||
@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _dieDissolveTime)
|
|
||||||
{
|
|
||||||
var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
|
@ -32,16 +32,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
public GhostBarrelData GhostBarrelData { get; private set; }
|
public GhostBarrelData GhostBarrelData { get; private set; }
|
||||||
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
||||||
|
|
||||||
[Title("효과")]
|
|
||||||
[SerializeField]
|
|
||||||
private float _spawnDissolveTime = 2f;
|
|
||||||
|
|
||||||
[SerializeField]
|
|
||||||
private float _dieDissolveTime = 1f;
|
|
||||||
|
|
||||||
// Hashes
|
|
||||||
private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -85,21 +75,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
SpineController.PlayAnimation(BoomBarrelAnimation.In.ToString(), false);
|
SpineController.PlayAnimation(BoomBarrelAnimation.In.ToString(), false);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _spawnDissolveTime)
|
|
||||||
{
|
|
||||||
if (CurrentHealthPoint == 0) yield break;
|
|
||||||
|
|
||||||
var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
BehaviorTree.EnableBehavior();
|
BehaviorTree.EnableBehavior();
|
||||||
HitBoxCollider.enabled = true;
|
HitBoxCollider.enabled = true;
|
||||||
@ -135,19 +111,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _dieDissolveTime)
|
|
||||||
{
|
|
||||||
var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
|
@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
public LavaBarrelData LavaBarrelData { get; private set; }
|
public LavaBarrelData LavaBarrelData { get; private set; }
|
||||||
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
||||||
|
|
||||||
[Title("효과")]
|
|
||||||
[SerializeField]
|
|
||||||
private float _spawnDissolveTime = 2f;
|
|
||||||
|
|
||||||
[SerializeField]
|
|
||||||
private float _dieDissolveTime = 1f;
|
|
||||||
|
|
||||||
// Hashes
|
|
||||||
private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -79,25 +69,9 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
|
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
|
||||||
BossSkillController.Initialize(BossData.SkillDataList);
|
BossSkillController.Initialize(BossData.SkillDataList);
|
||||||
|
|
||||||
yield return null;
|
|
||||||
|
|
||||||
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
|
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _spawnDissolveTime)
|
|
||||||
{
|
|
||||||
if (CurrentHealthPoint == 0) yield break;
|
|
||||||
|
|
||||||
var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
BehaviorTree.EnableBehavior();
|
BehaviorTree.EnableBehavior();
|
||||||
HitBoxCollider.enabled = true;
|
HitBoxCollider.enabled = true;
|
||||||
@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _dieDissolveTime)
|
|
||||||
{
|
|
||||||
var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
|
@ -31,16 +31,6 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
public SwordBarrelData SwordBarrelData { get; private set; }
|
public SwordBarrelData SwordBarrelData { get; private set; }
|
||||||
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
public GhostBarrelMapController GhostBarrelMapController { get; private set; }
|
||||||
|
|
||||||
[Title("효과")]
|
|
||||||
[SerializeField]
|
|
||||||
private float _spawnDissolveTime = 2f;
|
|
||||||
|
|
||||||
[SerializeField]
|
|
||||||
private float _dieDissolveTime = 1f;
|
|
||||||
|
|
||||||
// Hashes
|
|
||||||
private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
@ -78,26 +68,10 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
BossHealthPoint.Initialize(true, BossData.MaxHealthPoint,
|
BossHealthPoint.Initialize(true, BossData.MaxHealthPoint,
|
||||||
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
|
BossData.DisplayName, GhostBarrelMapController.ParticleInstanceLocation);
|
||||||
BossSkillController.Initialize(BossData.SkillDataList);
|
BossSkillController.Initialize(BossData.SkillDataList);
|
||||||
|
|
||||||
yield return null;
|
|
||||||
|
|
||||||
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
|
SpineController.PlayAnimation(BoomBarrelAnimation.Empty.ToString(), false);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _spawnDissolveTime)
|
|
||||||
{
|
|
||||||
if (CurrentHealthPoint == 0) yield break;
|
|
||||||
|
|
||||||
var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
BehaviorTree.EnableBehavior();
|
BehaviorTree.EnableBehavior();
|
||||||
HitBoxCollider.enabled = true;
|
HitBoxCollider.enabled = true;
|
||||||
@ -131,19 +105,7 @@ namespace BlueWater.Enemies.Bosses.GhostBarrel
|
|||||||
|
|
||||||
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
//await SpineController.WaitForAnimationCompletion(dieTrack);
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _dieDissolveTime)
|
|
||||||
{
|
|
||||||
var value = Mathf.Lerp(1f, 0f, elapsedTime / _dieDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using BlueWater.Items;
|
using System.Collections;
|
||||||
|
using BlueWater.Items;
|
||||||
using BlueWater.Maps;
|
using BlueWater.Maps;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@ -36,23 +37,37 @@ namespace BlueWater.Enemies.Bosses.Rhinoceros
|
|||||||
RhinocerosData = BossData as RhinocerosData;
|
RhinocerosData = BossData as RhinocerosData;
|
||||||
BossMapController = MapManager.Instance.RhinocerosMapController;
|
BossMapController = MapManager.Instance.RhinocerosMapController;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Initialize()
|
public override void Initialize()
|
||||||
|
{
|
||||||
|
StartCoroutine(InitializeCoroutine());
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator InitializeCoroutine()
|
||||||
{
|
{
|
||||||
BossHealthPoint.Initialize(true, RhinocerosData.MaxHealthPoint,
|
BossHealthPoint.Initialize(true, RhinocerosData.MaxHealthPoint,
|
||||||
RhinocerosData.DisplayName, BossMapController.ParticleInstanceLocation);
|
RhinocerosData.DisplayName, BossMapController.ParticleInstanceLocation);
|
||||||
BossSkillController.Initialize(BossData.SkillDataList);
|
BossSkillController.Initialize(BossData.SkillDataList);
|
||||||
SetMoveSpeed(RhinocerosData.MoveSpeed);
|
SetMoveSpeed(RhinocerosData.MoveSpeed);
|
||||||
StopMove();
|
StopMove();
|
||||||
|
|
||||||
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
|
|
||||||
BehaviorTree.EnableBehavior();
|
BehaviorTree.EnableBehavior();
|
||||||
|
HitBoxCollider.enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
#region Methods
|
#region Methods
|
||||||
|
|
||||||
|
protected override void Die()
|
||||||
|
{
|
||||||
|
StartCoroutine(DieCoroutine());
|
||||||
|
}
|
||||||
|
|
||||||
protected override async void Die()
|
private IEnumerator DieCoroutine()
|
||||||
{
|
{
|
||||||
BossSkillController.StopAllCoroutine();
|
BossSkillController.StopAllCoroutine();
|
||||||
BehaviorTree.DisableBehavior();
|
BehaviorTree.DisableBehavior();
|
||||||
@ -67,10 +82,10 @@ namespace BlueWater.Enemies.Bosses.Rhinoceros
|
|||||||
|
|
||||||
AnimationController.SetAnimationTrigger("isDead");
|
AnimationController.SetAnimationTrigger("isDead");
|
||||||
BossMapController.ClearMap(gameObject);
|
BossMapController.ClearMap(gameObject);
|
||||||
while (AnimationController.GetCurrentAnimationNormalizedTime() <= 1f)
|
|
||||||
{
|
yield return new WaitUntil(() => AnimationController.GetCurrentAnimationNormalizedTime() >= 1f);
|
||||||
await Awaitable.NextFrameAsync();
|
|
||||||
}
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
|
|
||||||
ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position);
|
ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position);
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
|
@ -7,20 +7,6 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
{
|
{
|
||||||
public class MiniSandMole : SandMole
|
public class MiniSandMole : SandMole
|
||||||
{
|
{
|
||||||
// Variables
|
|
||||||
#region Variables
|
|
||||||
[Title("효과")]
|
|
||||||
[SerializeField]
|
|
||||||
private float _spawnDissolveTime = 2f;
|
|
||||||
|
|
||||||
//[SerializeField]
|
|
||||||
//private float _dieDissolveTime = 1f;
|
|
||||||
|
|
||||||
// Hashes
|
|
||||||
private static readonly int _dissolveValueHash = Shader.PropertyToID("_DissolveValue");
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// Initialize methods
|
// Initialize methods
|
||||||
#region Initialize methods
|
#region Initialize methods
|
||||||
|
|
||||||
@ -28,11 +14,6 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
{
|
{
|
||||||
StartCoroutine(InitializeCoroutine());
|
StartCoroutine(InitializeCoroutine());
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
private IEnumerator InitializeCoroutine()
|
private IEnumerator InitializeCoroutine()
|
||||||
{
|
{
|
||||||
@ -43,21 +24,7 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
SetMoveSpeed(SandMoleData.MoveSpeed);
|
SetMoveSpeed(SandMoleData.MoveSpeed);
|
||||||
StopMove();
|
StopMove();
|
||||||
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 0f);
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
var elapsedTime = 0f;
|
|
||||||
while (elapsedTime <= _spawnDissolveTime)
|
|
||||||
{
|
|
||||||
if (CurrentHealthPoint == 0) yield break;
|
|
||||||
|
|
||||||
var value = Mathf.Lerp(0f, 1f, elapsedTime / _spawnDissolveTime);
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
elapsedTime += Time.deltaTime;
|
|
||||||
yield return null;
|
|
||||||
}
|
|
||||||
MaterialPropertyBlock.SetFloat(_dissolveValueHash, 1f);
|
|
||||||
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
|
||||||
|
|
||||||
SpineController.SetSkin(SandMoleSkin.Normal.ToString());
|
SpineController.SetSkin(SandMoleSkin.Normal.ToString());
|
||||||
var isRoar = false;
|
var isRoar = false;
|
||||||
@ -79,7 +46,17 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
HitBoxCollider.enabled = true;
|
HitBoxCollider.enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async void Die()
|
#endregion
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
protected override void Die()
|
||||||
|
{
|
||||||
|
StartCoroutine(DieCoroutine());
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator DieCoroutine()
|
||||||
{
|
{
|
||||||
BossSkillController.StopAllCoroutine();
|
BossSkillController.StopAllCoroutine();
|
||||||
SandMoleStatus.StopAllCoroutine();
|
SandMoleStatus.StopAllCoroutine();
|
||||||
@ -95,8 +72,11 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
|
|
||||||
SpineController.SetSkin(SandMoleSkin.Idle.ToString());
|
SpineController.SetSkin(SandMoleSkin.Idle.ToString());
|
||||||
var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false);
|
var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false);
|
||||||
|
|
||||||
|
yield return new WaitUntil(() => dieTrack.IsComplete);
|
||||||
|
|
||||||
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
|
|
||||||
await SpineController.WaitForAnimationCompletion(dieTrack);
|
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,12 +98,7 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
{
|
{
|
||||||
StartCoroutine(InitializeCoroutine());
|
StartCoroutine(InitializeCoroutine());
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
|
||||||
|
|
||||||
// Methods
|
|
||||||
#region Methods
|
|
||||||
|
|
||||||
private IEnumerator InitializeCoroutine()
|
private IEnumerator InitializeCoroutine()
|
||||||
{
|
{
|
||||||
HitBoxCollider.enabled = false;
|
HitBoxCollider.enabled = false;
|
||||||
@ -114,6 +109,8 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
SetMoveSpeed(SandMoleData.MoveSpeed);
|
SetMoveSpeed(SandMoleData.MoveSpeed);
|
||||||
StopMove();
|
StopMove();
|
||||||
|
|
||||||
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
|
|
||||||
SpineController.SetSkin(SandMoleSkin.Normal.ToString());
|
SpineController.SetSkin(SandMoleSkin.Normal.ToString());
|
||||||
var isCameraShakeActive = false;
|
var isCameraShakeActive = false;
|
||||||
var roarTrack = SpineController.PlayAnimation(SandMoleAnimation.Roar.ToString(), false);
|
var roarTrack = SpineController.PlayAnimation(SandMoleAnimation.Roar.ToString(), false);
|
||||||
@ -135,7 +132,17 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
HitBoxCollider.enabled = true;
|
HitBoxCollider.enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async void Die()
|
#endregion
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
#region Methods
|
||||||
|
|
||||||
|
protected override void Die()
|
||||||
|
{
|
||||||
|
StartCoroutine(DieCoroutine());
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator DieCoroutine()
|
||||||
{
|
{
|
||||||
BossSkillController.StopAllCoroutine();
|
BossSkillController.StopAllCoroutine();
|
||||||
SandMoleStatus.StopAllCoroutine();
|
SandMoleStatus.StopAllCoroutine();
|
||||||
@ -152,8 +159,11 @@ namespace BlueWater.Enemies.Bosses.SandMole
|
|||||||
SpineController.SetSkin(SandMoleSkin.Idle.ToString());
|
SpineController.SetSkin(SandMoleSkin.Idle.ToString());
|
||||||
var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false);
|
var dieTrack = SpineController.PlayAnimation(SandMoleAnimation.Die.ToString(), false);
|
||||||
SandMoleMapController.ClearMap(gameObject);
|
SandMoleMapController.ClearMap(gameObject);
|
||||||
|
|
||||||
|
yield return new WaitUntil(() => dieTrack.IsComplete);
|
||||||
|
|
||||||
|
yield return StartCoroutine(DissolveCoroutine(1f, 0f, DieDissolveTime));
|
||||||
|
|
||||||
await SpineController.WaitForAnimationCompletion(dieTrack);
|
|
||||||
ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position);
|
ItemManager.Instance.ItemDropRandomPosition(BossData.CharacterIdx, transform.position);
|
||||||
Destroy(gameObject);
|
Destroy(gameObject);
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
using BlueWater.Interfaces;
|
using System.Collections;
|
||||||
|
using BlueWater.Interfaces;
|
||||||
using BlueWater.Players;
|
using BlueWater.Players;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
@ -64,6 +65,32 @@ namespace BlueWater.Enemies.Bosses
|
|||||||
|
|
||||||
// Methods
|
// Methods
|
||||||
#region Methods
|
#region Methods
|
||||||
|
|
||||||
|
protected override IEnumerator DissolveCoroutine(float start, float end, float dissolveTime)
|
||||||
|
{
|
||||||
|
if (!IsDissolveActive)
|
||||||
|
{
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, end);
|
||||||
|
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
yield break;
|
||||||
|
}
|
||||||
|
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, start);
|
||||||
|
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
|
||||||
|
var elapsedTime = 0f;
|
||||||
|
while (elapsedTime <= dissolveTime)
|
||||||
|
{
|
||||||
|
var value = Mathf.Lerp(start, end, elapsedTime / dissolveTime);
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, value);
|
||||||
|
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
elapsedTime += Time.deltaTime;
|
||||||
|
yield return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
MaterialPropertyBlock.SetFloat(_dissolveValueHash, end);
|
||||||
|
MeshRenderer.SetPropertyBlock(MaterialPropertyBlock);
|
||||||
|
}
|
||||||
|
|
||||||
protected virtual void FlipVisualLook()
|
protected virtual void FlipVisualLook()
|
||||||
{
|
{
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Collections;
|
||||||
using BlueWater.Items;
|
using BlueWater.Items;
|
||||||
using BlueWater.Maps;
|
using BlueWater.Maps;
|
||||||
using Sirenix.OdinInspector;
|
using Sirenix.OdinInspector;
|
||||||
@ -40,18 +41,31 @@ namespace BlueWater.Enemies.Bosses.TitanSlime
|
|||||||
|
|
||||||
public void Initialize(int level, bool hasRabbit)
|
public void Initialize(int level, bool hasRabbit)
|
||||||
{
|
{
|
||||||
|
StartCoroutine(InitializeCoroutine(level, hasRabbit));
|
||||||
|
}
|
||||||
|
|
||||||
|
private IEnumerator InitializeCoroutine(int level, bool hasRabbit)
|
||||||
|
{
|
||||||
|
HitBoxCollider.enabled = false;
|
||||||
|
_rabbit.enabled = false;
|
||||||
var titanSlimeState = TitanSlimeData.TitanSlimeState.Find(list => list.Level == level);
|
var titanSlimeState = TitanSlimeData.TitanSlimeState.Find(list => list.Level == level);
|
||||||
TitanSlimeState = new TitanSlimeState(titanSlimeState, hasRabbit);
|
TitanSlimeState = new TitanSlimeState(titanSlimeState, hasRabbit);
|
||||||
transform.localScale = Vector3.one * TitanSlimeState.Size;
|
transform.localScale = Vector3.one * TitanSlimeState.Size;
|
||||||
_rabbit.enabled = TitanSlimeState.HasRabbit;
|
|
||||||
MinCoolDown = TitanSlimeState.RandomCooldown.x;
|
MinCoolDown = TitanSlimeState.RandomCooldown.x;
|
||||||
MaxCoolDown = TitanSlimeState.RandomCooldown.y;
|
MaxCoolDown = TitanSlimeState.RandomCooldown.y;
|
||||||
|
|
||||||
BossHealthPoint.Initialize(TitanSlimeState.HasRabbit, TitanSlimeState.MaxHp,
|
BossHealthPoint.Initialize(TitanSlimeState.HasRabbit, TitanSlimeState.MaxHp,
|
||||||
TitanSlimeData.DisplayName, _titanSlimeMapController.ParticleInstanceLocation);
|
TitanSlimeData.DisplayName, _titanSlimeMapController.ParticleInstanceLocation);
|
||||||
BossSkillController.Initialize(BossData.SkillDataList);
|
BossSkillController.Initialize(BossData.SkillDataList);
|
||||||
|
|
||||||
|
if (TitanSlimeState.HasRabbit && titanSlimeState.Level == 1)
|
||||||
|
{
|
||||||
|
yield return StartCoroutine(DissolveCoroutine(0f, 1f, SpawnDissolveTime));
|
||||||
|
}
|
||||||
|
_rabbit.enabled = TitanSlimeState.HasRabbit;
|
||||||
|
|
||||||
BehaviorTree.EnableBehavior();
|
BehaviorTree.EnableBehavior();
|
||||||
|
HitBoxCollider.enabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
|
Loading…
Reference in New Issue
Block a user