// ***********************************************************************
// Assembly : Game
// Author : Kimch
// Created : 2020-12-25
// Description :
// Last Modified By :
// Last Modified On :
// ***********************************************************************
//
//
// ***********************************************************************
using UnityEngine;
using UnityEngine.EventSystems;
namespace G
{
///
/// 无尽宝箱
///
public class EntityGiftBox : Entity
{
public Transform ef_open1;
public Transform ef_open2;
public Transform ef_smoke_bossBox;
public Transform ef_bossBox_light;
public AudioClip snd_drop;
public AudioClip snd_open;
private bool _dropImpact;
private bool _itemRising;
private bool _isBossLevel;
private Collider _collider;
private AudioSource _audioSource;
private Transform _spawnRoot;
private Animator _dropBoxAnimator;
private Animator _bossDropBoxAnimator;
#region Method
///
///
///
public bool canOpen
{
get { return _collider.enabled; }
}
private System.Collections.IEnumerator OpenSmoke()
{
yield return new WaitForSeconds(0.4f);//间隔多少时间播放烟尘特效
if (_isBossLevel)
{
ef_smoke_bossBox.gameObject.SetActive(true);
}
}
///
///
///
///
private System.Collections.IEnumerator Open()
{
PlayOpenAnim();//开启宝箱掉落动画
if (_isBossLevel)
{
ef_open2.gameObject.SetActive(true);
yield return new WaitForSeconds(1.65f);//间隔多长时间去播放打开箱子的闪光
}
else
{
yield return new WaitForSeconds(0.05f);
ef_open1.gameObject.SetActive(true);
}
_audioSource.PlayOneShot(snd_open);
_itemRising = true;
var dropBox = BoxProxy.Instance.GetBoxInfo(GameLevel.Instance.stageBoxId);
if (dropBox != null)
{
int spIndex = 0;
int extraWeight = EntityMainPlayer.Instance.dropBoost;
var items = dropBox.GetRndItems(extraWeight);
for (int i = 0; i < items.Count; i++)
{
if (items[i].id > 0)
{
Vector3 a = _spawnRoot.GetChild(spIndex++).position;
if (spIndex >= _spawnRoot.childCount)
spIndex = 0;
//Vector3 a = Random.onUnitSphere * Random.Range(0.18f, 0.26f);
EnemyHelper.Instance.CreateBox(items[i].id, items[i].count, a);
}
}
var extra = dropBox.GetExtraItem();
if (extra.id > 0)
{
Vector3 a = _spawnRoot.GetChild(spIndex++).position;
if (spIndex >= _spawnRoot.childCount)
spIndex = 0;
EnemyHelper.Instance.CreateBox(extra.id, extra.count, a);
}
}
yield return new WaitForSeconds(1f); //boss宝箱播放开启闪光后到打开第二个特效间隔时间
if (_isBossLevel)
{
ef_bossBox_light.gameObject.SetActive(true);
}
}
static int _Drop_I_Hash = Animator.StringToHash("drop_i");
bool IsDrop_I()
{
if (_isBossLevel)
{
return _bossDropBoxAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash == _Drop_I_Hash;
}
else
{
return _dropBoxAnimator.GetCurrentAnimatorStateInfo(0).shortNameHash == _Drop_I_Hash;
}
}
void PlayOpenAnim()
{
if (_isBossLevel)
{
_bossDropBoxAnimator.Play("open_box");
}
else
{
_dropBoxAnimator.Play("open_box");
}
}
void PlayOpenFx()
{
if (_isBossLevel)
{
ef_open1.gameObject.SetActive(false);
ef_open2.gameObject.SetActive(true);
}
else
{
ef_open1.gameObject.SetActive(true);
ef_open2.gameObject.SetActive(false);
}
}
#endregion
#region Unity
public static EntityGiftBox Instance;
private void Awake()
{
_collider = GetComponent();
_collider.enabled = false;
_audioSource = GetComponent();
_dropBoxAnimator = transform.GetChild(0).GetComponent();
_bossDropBoxAnimator = transform.GetChild(1).GetComponent();
_spawnRoot = transform.Find("bbbpoint");
gameObject.SetActive(false);
}
private void Start()
{
SoundProxy.Instance.SetAudioMixer(_audioSource, SoundProxy.FX_LAYER_INDEX);
}
private void OnEnable()
{
Instance = this;
_dropImpact = false;
_itemRising = false;
_isBossLevel = GameLevel.Instance.isBossStage;
if (_isBossLevel)
{
_dropBoxAnimator.gameObject.SetActive(false);
_bossDropBoxAnimator.gameObject.SetActive(true);
}
else
{
_dropBoxAnimator.gameObject.SetActive(true);
_bossDropBoxAnimator.gameObject.SetActive(false);
}
ef_open1.gameObject.SetActive(false);
ef_open2.gameObject.SetActive(false);
ef_bossBox_light.gameObject.SetActive(false);
ef_smoke_bossBox.gameObject.SetActive(false);
StartCoroutine(OpenSmoke());
}
private void OnDisable()
{
Instance = null;
}
private void OnTriggerEnter(Collider other)
{
_collider.enabled = false;
GameLevel.Instance.OpenPortal();
StartCoroutine(Open());
}
private void Update()
{
if (!_dropImpact)
{
if (IsDrop_I())
{
_dropImpact = true;
_collider.enabled = true;
_audioSource.PlayOneShot(snd_drop);
}
}
else if (_itemRising)
{
//Vector3 position = ef_risingitem.position;
//if (position.y < 1f)
//{
// ef_risingitem.position += Vector3.up * Time.deltaTime;
// return;
//}
_itemRising = false;
//ef_risingitem.GetComponent().Stop();
}
}
#endregion
}
}