using System;
|
using System.Collections;
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
using UnityEngine.UI;
|
|
namespace vnxbqy.UI
|
{
|
public class UI3DHeroSkillShow : MonoBehaviour
|
{
|
static UI3DHeroSkillShow m_Instance = null;
|
public static UI3DHeroSkillShow Instance {
|
get {
|
if (m_Instance == null)
|
{
|
var gameObject = Instantiate(UILoader.LoadTreasure("Misc", "UI3DHeroSkillShow"));
|
m_Instance = gameObject.GetComponent<UI3DHeroSkillShow>();
|
Instance.transform.position = new Vector3(0, 4000, 5000);
|
m_Instance.name = "UI3DHeroSkillShow";
|
m_Instance.SetActive(true);
|
DontDestroyOnLoad(gameObject);
|
}
|
|
return m_Instance;
|
}
|
}
|
|
[SerializeField] Transform m_Stage;
|
[SerializeField] Camera m_ShowCamera;
|
[SerializeField] Animator m_CameraAnimator;
|
[SerializeField] List<RuntimeAnimatorController> m_HeroShowControllers;
|
[SerializeField] List<TreasureSkill> m_TreasureSkills;
|
[SerializeField] List<SkillAct> m_SkillActs;
|
|
UI3DShowHero m_HeroShow = new UI3DShowHero();
|
|
PackModel playerPack { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
|
|
Transform m_HeroPoint;
|
public Transform hero {
|
get {
|
return m_HeroPoint;
|
}
|
}
|
|
Animator m_HeroAnimator;
|
|
Action m_HeroSkillCompletet;
|
|
SFXController m_SkillExtraSfx;
|
|
public int cacheSkillId { get; private set; }
|
|
public Camera showCamera { get { return m_ShowCamera; } }
|
|
public SFXController skillEffect;
|
|
public Transform MP_Name1 {
|
get {
|
var mp_name = hero.GetChildTransformDeeply("A_Name2");
|
if (!mp_name)
|
{
|
return hero;
|
}
|
return mp_name;
|
}
|
}
|
|
public Transform MP_Weapon {
|
get {
|
var mp_weapon = hero.GetChildTransformDeeply(WEAPON_NODE);
|
if (mp_weapon != null)
|
{
|
if (mp_weapon.childCount > 0)
|
{
|
return mp_weapon.GetChild(0);
|
}
|
return mp_weapon;
|
}
|
return hero;
|
}
|
}
|
|
const string WEAPON_NODE = "Bip001 Prop1";
|
|
|
private void ShowHeroSkill(int _skillId, string _clip)
|
{
|
if (UI3DTreasureSelectStage.Instance.IsOpen)
|
{
|
UI3DTreasureSelectStage.Instance.showCamera.enabled = false;
|
}
|
|
cacheSkillId = _skillId;
|
|
var _job = PlayerDatas.Instance.baseData.Job;
|
|
#region 装备
|
var appearance = ModelCenter.Instance.GetModel<EquipModel>().GetAppearance();
|
|
var _clothesId = appearance.clothes;
|
var _wingsId = appearance.wings;
|
var _secondaryId = appearance.secondary;
|
var _weaponId = appearance.weapon;
|
var fashionClothesId = appearance.fashionClothes;
|
var fashionWeaponId = appearance.fashionWeapon;
|
var fashionSecondaryId = appearance.fashionSecondary;
|
|
int _suitLevel = 0;
|
#endregion
|
|
UI3DPlayerExhibitionData data = new UI3DPlayerExhibitionData()
|
{
|
job = _job,
|
fashionClothesId = fashionClothesId,
|
clothesId = _clothesId,
|
suitLevel = _suitLevel,
|
fashionWeaponId = fashionWeaponId,
|
weaponId = _weaponId,
|
wingsId = _wingsId,
|
fashionSecondaryId = fashionSecondaryId,
|
secondaryId = _secondaryId,
|
isDialogue = false,
|
};
|
|
var _hero = m_HeroShow.Show(data, m_Stage);
|
if (_hero != null)
|
{
|
m_HeroPoint = _hero.transform;
|
m_HeroAnimator = _hero.GetComponent<Animator>();
|
if (m_HeroAnimator != null)
|
{
|
m_HeroAnimator.runtimeAnimatorController = m_HeroShowControllers[_job - 1];
|
StartCoroutine(Co_PlaySkill());
|
}
|
}
|
|
m_Stage.localEulerAngles = Vector3.zero;
|
m_ShowCamera.SetActive(true);
|
|
m_CameraAnimator.Play(_clip, 0, 0);
|
m_CameraAnimator.speed = 0;
|
}
|
|
public void ShowTreasureSkill(int _treasureId, Action callback)
|
{
|
StopShow();
|
|
Treasure _treasure;
|
ModelCenter.Instance.GetModel<TreasureModel>().TryGetTreasure(_treasureId, out _treasure);
|
if (_treasure != null)
|
{
|
m_HeroSkillCompletet = callback;
|
var _skillId = _treasure.skillId;
|
var _index = m_TreasureSkills.FindIndex((x) =>
|
{
|
return x.treasureId == _treasureId;
|
});
|
var _treasureSkill = _index != -1 ? m_TreasureSkills[_index] : m_TreasureSkills[0];
|
_index = _treasureSkill.clip.FindIndex((x) =>
|
{
|
return (int)x.job == PlayerDatas.Instance.baseData.Job;
|
});
|
var _clip = _index != -1 ? _treasureSkill.clip[_index] : _treasureSkill.clip[0];
|
ShowHeroSkill(_skillId, _clip.clip);
|
if (_treasureSkill.effects != null && _treasureSkill.effects.Count > 0)
|
{
|
_index = _treasureSkill.effects.FindIndex((x) =>
|
{
|
return (int)x.job == PlayerDatas.Instance.baseData.Job;
|
});
|
var _effect = _index != -1 ? _treasureSkill.effects[_index] : _treasureSkill.effects[0];
|
StartCoroutine(Co_PlayExtraEffect(_effect));
|
}
|
}
|
}
|
|
private void StartPlaySkill(int _skillId)
|
{
|
var config = SkillConfig.Get(_skillId);
|
if (config == null)
|
{
|
return;
|
}
|
var skillActMark = config.Skillactmark;
|
|
var index = m_SkillActs.FindIndex((x) =>
|
{
|
return x.skillId == _skillId;
|
});
|
|
if (index != -1)
|
{
|
skillActMark = m_SkillActs[index].mark;
|
}
|
|
if (skillActMark > 0 && skillActMark < 20)
|
{
|
switch (config.Skillactmark)
|
{
|
case 10:
|
m_HeroAnimator.Play(GAStaticDefine.State_Attack1Hash, 0);
|
break;
|
case 11:
|
m_HeroAnimator.Play(GAStaticDefine.State_Attack2Hash, 0);
|
break;
|
case 12:
|
m_HeroAnimator.Play(GAStaticDefine.State_Attack3Hash, 0);
|
break;
|
case 13:
|
m_HeroAnimator.Play(GAStaticDefine.State_Attack4Hash, 0);
|
break;
|
}
|
}
|
else
|
{
|
switch (skillActMark)
|
{
|
case 21:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill21, 0);
|
break;
|
case 22:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill22, 0);
|
break;
|
case 23:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill23, 0);
|
break;
|
case 24:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill24, 0);
|
break;
|
case 25:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill25, 0);
|
break;
|
case 26:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill26, 0);
|
break;
|
case 27:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill27, 0);
|
break;
|
case 28:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill28, 0);
|
break;
|
case 29:
|
m_HeroAnimator.Play(GAStaticDefine.State_Skill29, 0);
|
break;
|
case 99:
|
m_HeroAnimator.Play(GAStaticDefine.State_RollHash, 0);
|
break;
|
}
|
}
|
|
|
}
|
|
IEnumerator Co_PlaySkill()
|
{
|
yield return WaitingForSecondConst.WaitMS1000;
|
if (m_HeroAnimator != null)
|
{
|
StartPlaySkill(cacheSkillId);
|
}
|
|
m_CameraAnimator.speed = 1;
|
yield return null;
|
var _showTime = m_CameraAnimator.GetCurrentAnimatorStateInfo(0).length;
|
yield return new WaitForSeconds(_showTime);
|
if (m_HeroSkillCompletet != null)
|
{
|
m_HeroSkillCompletet();
|
}
|
StopShow();
|
}
|
|
IEnumerator Co_PlayExtraEffect(Effect effect)
|
{
|
yield return new WaitForSeconds(effect.startTime);
|
if (m_SkillExtraSfx != null)
|
{
|
SFXPlayUtility.Instance.Release(m_SkillExtraSfx);
|
m_SkillExtraSfx = null;
|
}
|
var parent = hero;
|
if (!string.IsNullOrEmpty(effect.parentName) && hero != null)
|
{
|
parent = hero.GetChildTransformDeeply(effect.parentName, true);
|
}
|
m_SkillExtraSfx = SFXPlayUtility.Instance.Play(effect.id, parent);
|
if (m_SkillExtraSfx != null)
|
{
|
m_SkillExtraSfx.duration = effect.duration;
|
m_SkillExtraSfx.transform.localPosition = effect.position;
|
}
|
}
|
|
public void StopShow()
|
{
|
if (UI3DTreasureSelectStage.Instance.IsOpen)
|
{
|
UI3DTreasureSelectStage.Instance.showCamera.enabled = true;
|
}
|
m_ShowCamera.SetActive(false);
|
m_HeroSkillCompletet = null;
|
m_HeroShow.Dispose();
|
if (m_SkillExtraSfx != null)
|
{
|
SFXPlayUtility.Instance.Release(m_SkillExtraSfx);
|
m_SkillExtraSfx = null;
|
}
|
|
if (skillEffect != null)
|
{
|
SFXPlayUtility.Instance.Release(skillEffect);
|
skillEffect = null;
|
}
|
}
|
|
[Serializable]
|
public struct CameraClip
|
{
|
public PlayerJob job;
|
public string clip;
|
}
|
|
[Serializable]
|
public struct Effect
|
{
|
public PlayerJob job;
|
public int id;
|
public float startTime;
|
public float duration;
|
public string parentName;
|
public Vector3 position;
|
}
|
|
[Serializable]
|
public struct TreasureSkill
|
{
|
public int treasureId;
|
public List<CameraClip> clip;
|
public List<Effect> effects;
|
}
|
|
[Serializable]
|
public struct SkillAct
|
{
|
public int skillId;
|
public int mark;
|
}
|
|
public enum PlayerJob
|
{
|
Qiang = 1,
|
Fashi,
|
}
|
}
|
}
|
|