Files
Main/Assets/Editor/DIY/SkillEditor/EditorEntity.cs

787 lines
32 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
using Thousandto.Code.Logic;
using Thousandto.Code.Logic.WarningField;
using Thousandto.Core.Asset;
using Thousandto.Core.Base;
using Thousandto.SkillEditor;
using Thousandto.SkillEditor.DIY;
using Thousandto.SkillEditor.Support;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;
using Thousandto.Cfg.Data;
using Thousandto.Launcher.ExternalLibs;
namespace Thousandto.SkillEditor.DIY
{
public enum EditorEntityState
{
Idle,
Move,
Jump,
HitStiff, //受击僵直
HitBack, //击退
HitFly, //击飞
Lie, //击飞后倒地
HitGrab, //抓取
}
public class EditorEntity : EditorBaseObject
{
#region//私有变量
private AnimationPlayer _animPlayer = null;
private EditorEntityState _curState = EditorEntityState.Idle;
private Vector3 _moveDir = Vector3.forward;
private ForwardRoter _roter = null;
private float _scale = 1f;
private float _moveSpeed = 6f;
private Vector3 _jumpStart = Vector3.zero;
private Vector3 _jumpCenter = Vector3.zero;
private Vector3 _jumpTarget = Vector3.zero;
private float _jumpTimer = 0f;
private const float JumpTime = 1f;
private float _hitStateTimer = 0f;
private HitEffectInfo _hitEffectInfo = null;
private Vector3 _hitBackOriPos = Vector3.zero;
private Vector3 _hitBackTargetPos = Vector3.zero;
private float _getUpAnimTime = 0f;
private float _lieTime = 0f;
private Vector3[] _hitFlyCurve = null;
private Vector3 _grabOriPos = Vector3.zero;
private Vector3 _grabTargetPos = Vector3.zero;
private Material _mater = null;
private float _blinkTimer = 0f;
private float _blinkMaxTime = 0f;
private float _blinkPower = 0f;
private Color _blinkColor = Color.white;
private AnimationCurve _blinkCurve = null;
private AnimationPlayer _animPlayerRun = null;
private GameObject _runGo = null;
private bool _hideWeapon = false;
private List<GameObject> _weaponList = new List<GameObject>();
#endregion
#region//属性
public EditorEntityState CurState { get { return _curState; } }
public bool DisableMove { get; set; }
public bool DisableChangeDir { get; set; }
public EditorSkillManager SkillManager { get; private set; }
public bool IsPauseAnim { get; private set; }
public bool HideWeapon
{
get
{
return _hideWeapon;
}
set
{
if (_hideWeapon != value)
{
_hideWeapon = value;
for (int i = 0; i < _weaponList.Count; ++i)
{
_weaponList[i].SetActive(!_hideWeapon);
}
}
}
}
public ForwardRoter Roter { get { return _roter; } }
#endregion
#region//构造函数
public EditorEntity(GameObject rootGo, EditorObjType objType, float scale, float moveSpeed) :
base(rootGo, objType)
{
var anim = UnityUtils.RequireComponent<AnimListBaseScript>(rootGo);
anim.AddClips(AnimInfo.GetClips(anim.AnimAssetPathDic.Values));
_animPlayer = new AnimationPlayer(anim);
_roter = new ForwardRoter();
_roter.CurForward = RootGo.transform.forward;
_roter.CurSpeed = 0.7f;
SkillManager = new EditorSkillManager(this);
var render = RootTrans.GetComponentInChildren<SkinnedMeshRenderer>();
_mater = render.material;
_runGo = (GameObject)GameObject.Instantiate(rootGo);
anim = UnityUtils.RequireComponent<AnimListBaseScript>(_runGo);
anim.AddClips(AnimInfo.GetClips(anim.AnimAssetPathDic.Values));
_animPlayerRun = new AnimationPlayer(anim);
_runGo.SetActive(false);
_runGo.transform.parent = _runGo.transform;
_scale = scale;
_moveSpeed = moveSpeed;
if(_moveSpeed < 1f)
{
_moveSpeed = 1f;
}
StopSate();
}
#endregion
#region//
public void StopSate()
{
if (_curState == EditorEntityState.Jump)
return;
if (_curState != EditorEntityState.Idle || !_animPlayer.IsPlaying)
{
if (IsPauseAnim)
{
_animPlayer.Stop();
IsPauseAnim = false;
_runGo.SetActive(false);
}
if(_animPlayer.UseHalfBody)
{
if (_animPlayer.UPPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.UPPart.CurState.ParentAnimName) == FAnimLogicType.Skill &&
_animPlayer.LowerPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.LowerPart.CurState.ParentAnimName) == FAnimLogicType.Skill)
{
//上下半身都是播放技能动作,不替换动作
}
else if (_animPlayer.UPPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.UPPart.CurState.ParentAnimName) == FAnimLogicType.Skill)
{
//如果只有上半身在播放技能动作
if (_animPlayer.UPPart.CurState.ClipLength * (1f - _animPlayer.UPPart.CurState.CurNormalizeTime) < 0.2f)
{
//如果上半身的时间已经不够融合了直接播放idle
_animPlayer.Play(ObjType == EditorObjType.Player ? AnimClipNameDefine.FightIdle : AnimClipNameDefine.NormalIdle, AnimationPartType.AllBody, WrapMode.Loop);
}
else
{
//如果上半身在放技能动作,播放整体技能动作
string animName = FPlayerAnimRelation.SkillMoveToIdle(_animPlayer.UPPart.CurState.ParentAnimName);
_animPlayer.Play(animName, AnimationPartType.AllBody,
_animPlayer.UPPart.CurState.WrapMode,
true, 0.2f,
_animPlayer.UPPart.CurState.Speed,
_animPlayer.UPPart.CurState.CurNormalizeTime);
}
}
else if (!SkillManager.IsUsing)
{
_animPlayer.Play(ObjType == EditorObjType.Player ? AnimClipNameDefine.FightIdle : AnimClipNameDefine.NormalIdle, AnimationPartType.AllBody, WrapMode.Loop);
}
}
else
{
if (!SkillManager.IsUsing)
{
_animPlayer.Play(AnimClipNameDefine.NormalIdle, AnimationPartType.AllBody, WrapMode.Loop);
}
}
}
_curState = EditorEntityState.Idle;
}
float VectorAngle(Vector2 from, Vector2 to)
{
float angle;
Vector3 cross = Vector3.Cross(from, to);
angle = Vector2.Angle(from, to);
return cross.z > 0 ? -angle : angle;
}
public void MoveTo(Vector3 dir, EditorEntity target)
{
if (_curState == EditorEntityState.Jump)
return;
if (IsPauseAnim)
{
_animPlayer.Stop();
IsPauseAnim = false;
_runGo.SetActive(false);
}
_moveDir = dir;
_moveDir.y = 0f;
_moveDir = _moveDir.normalized;
if (DisableMove)
{
if (!DisableChangeDir)
{
_roter.DestForward = _moveDir;
}
return;
}
var modelDir = _moveDir;
var animName = AnimClipNameDefine.FightRunFront;
if (target != null && Vector3.SqrMagnitude(target.RootTrans.position - RootTrans.position) < 100f)
{
var tarDir = target.RootTrans.position - RootTrans.position;
tarDir.y = 0f;
tarDir = tarDir.normalized;
var angle = VectorAngle(new Vector2(_moveDir.x, _moveDir.z), new Vector2(tarDir.x, tarDir.z));
//4方向
if ((angle >= 0 && angle <= 45f) || (angle <= 0 && angle >= -45f))
{
modelDir = _moveDir;
animName = AnimClipNameDefine.FightRunFront;
}
else if (angle >= 135f || angle <= -135)
{
modelDir = -_moveDir;
animName = AnimClipNameDefine.FightRunBack;
}
else if (angle >= 0f)
{
modelDir = tarDir;
animName = AnimClipNameDefine.FightRunLeft;
}
else if (angle < 0f)
{
modelDir = tarDir;
animName = AnimClipNameDefine.FightRunRight;
}
}
if (_curState != EditorEntityState.Move || !_animPlayer.IsPlaying || (_animPlayer.UseHalfBody && !_animPlayer.IsLowerPlayAnim(animName)))
{
if(_animPlayer.UseHalfBody)
{
float normalTime = 0f;
if (_animPlayer.LowerPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.LowerPart.CurState.ParentAnimName) == FAnimLogicType.Move)
{
normalTime = _animPlayer.LowerPart.CurState.CurNormalizeTime;
}
if (_animPlayer.UPPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.UPPart.CurState.ParentAnimName) == FAnimLogicType.Skill
&& _animPlayer.LowerPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.LowerPart.CurState.ParentAnimName) == FAnimLogicType.Skill)
{
//如果上下半身都在播放技能,尝试切换到移动技能动作
string moveSkill = FPlayerAnimRelation.SkillIdleToMove(_animPlayer.UPPart.CurState.ParentAnimName);
if (_animPlayer.Play(moveSkill, AnimationPartType.UpBody,
_animPlayer.UPPart.CurState.WrapMode, true, 0.2f,
_animPlayer.UPPart.CurState.Speed,
_animPlayer.UPPart.CurState.CurNormalizeTime))
{
//如果可以切换到移动技能动作,下半身播放移动动作
if (!_animPlayer.LowerPart.IsPlaying || _animPlayer.LowerPart.CurState.ParentAnimName != animName)
{
_animPlayer.Play(animName, AnimationPartType.LowerBody, WrapMode.Loop, true, 0.2f, 1f, normalTime);
}
}
else if (!SkillManager.IsUsing)
{
//如果正在播放技能收招动作,直接切换
_animPlayer.Play(animName, AnimationPartType.AllBody, WrapMode.Loop, true, 0.2f, 1f, normalTime);
}
}
else if (_animPlayer.UPPart.IsPlaying && FPlayerAnimRelation.GetLogicType(_animPlayer.UPPart.CurState.ParentAnimName) == FAnimLogicType.Skill)
{
//上半身在播放技能,下半身播放跑步动作
if (!_animPlayer.LowerPart.IsPlaying || _animPlayer.LowerPart.CurState.ParentAnimName != animName)
{
_animPlayer.Play(animName, AnimationPartType.LowerBody, WrapMode.Loop, true, 0.2f, 1f, normalTime);
}
}
else
{
if (!SkillManager.IsUsing)
{
_animPlayer.Play(animName, AnimationPartType.AllBody, WrapMode.Loop, true, 0.2f, 1f, normalTime);
}
}
}
else
{
if (!SkillManager.IsUsing)
{
_animPlayer.Play(AnimClipNameDefine.NormalRun, AnimationPartType.AllBody, WrapMode.Loop, true, 0.2f, 1f, 0f);
}
}
}
_roter.DestForward = modelDir;
_curState = EditorEntityState.Move;
}
public void JumpTo(Vector3 dir)
{
if (_curState == EditorEntityState.Jump)
return;
if (DisableMove)
return;
if (IsPauseAnim)
{
_animPlayer.Stop();
IsPauseAnim = false;
_runGo.SetActive(false);
}
dir.y = 0f;
dir = dir.normalized;
_jumpStart = RootTrans.position;
_jumpTimer = 0f;
if (dir == Vector3.zero)
{
//原地跳跃
_jumpTarget = RootTrans.position;
_jumpCenter = RootTrans.position + Vector3.up * 5f;
}
else
{
//方向跳跃
_jumpTarget = dir * 6f + _jumpStart;
_jumpCenter = Vector3.Lerp(_jumpTarget, _jumpStart, 0.5f);
_jumpCenter += Vector3.up * 5f;
}
_animPlayer.Play("jump", AnimationPartType.AllBody, WrapMode.Once, true, 0.2f, 0.5f / JumpTime);
_roter.DestForward = _moveDir;
_curState = EditorEntityState.Jump;
}
public void DoHitEffect(EditorBaseObject user, Vector3 mainDir, HitEffectInfo hitInfo)
{
Vector3 dir = Vector3.zero;
if (hitInfo.HitDirType == SkillHitDirType.RealDir)
{
dir = RootTrans.position - user.RootTrans.position;
}
else
{
dir = mainDir;
}
dir.y = 0;
dir = dir.normalized;
DoHitEffect(user.RootTrans.position, dir, hitInfo);
}
public void DoHitEffect(EditorLockFlyVfx flyVfx, HitEffectInfo hitInfo)
{
var dir = RootTrans.position - flyVfx.RootTrans.position;
dir.y = 0;
dir = dir.normalized;
DoHitEffect(flyVfx.RootTrans.position, dir, hitInfo);
}
public SkillHitType HitTypeCheck(HitEffectInfo hitInfo)
{
switch (hitInfo.HitType)
{
case SkillHitType.HitStiff:
case SkillHitType.HitBack:
if (CurState == EditorEntityState.HitFly)
{
//追击击飞
return SkillHitType.HitFly;
}
break;
}
return hitInfo.HitType;
}
public void DoHitEffect(Vector3 userPos, Vector3 dir, HitEffectInfo hitInfo)
{
if (IsPauseAnim)
{
_animPlayer.Stop();
IsPauseAnim = false;
_runGo.SetActive(false);
}
_hitEffectInfo = hitInfo;
//播放受击特效
if(hitInfo.HitVfx > 0)
{
var hitTrans = SlotUtils.GetSlotTransform(RootTrans, hitInfo.HitSlot);
var resPath = AssetUtils.GetModelAssetPath(ModelTypeCode.SkillVFX, hitInfo.HitVfx);
EditorVFXPlayer.Instance.PlayVFX(resPath, hitTrans);
}
//播放闪烁效果
Blink(hitInfo.BlinkTime, hitInfo.BlinkPower, hitInfo.BlinkColor, hitInfo.BlinkCurve);
//播放受击效果
var hitType = HitTypeCheck(hitInfo);
switch (hitType)
{
case SkillHitType.None:
{
_roter.DestForward = -dir;
PlayAnim(hitInfo.HitAnim, WrapMode.Once, 1f, 0f);
}
break;
case SkillHitType.HitStiff:
{
_roter.DestForward = -dir;
PlayAnim(hitInfo.HitAnim, WrapMode.Once, 1f, 0f);
_curState = EditorEntityState.HitStiff;
_hitStateTimer = 0f;
}
break;
case SkillHitType.HitBack:
{
_roter.DestForward = -dir;
PlayAnim(hitInfo.HitAnim, WrapMode.Once, 1f, 0f);
_curState = EditorEntityState.HitBack;
_hitStateTimer = 0f;
_hitBackOriPos = RootTrans.position;
_hitBackTargetPos = RootTrans.position + hitInfo.BackDis * dir;
_hitBackTargetPos.y = 0f;
}
break;
case SkillHitType.HitFly:
{
_roter.DestForward = -dir;
var flyPoint = new Vector3[3];
var targetPos = RootTrans.position + dir * hitInfo.FlyDis;
targetPos.y = 0f;
PlayAnim(AnimClipNameDefine.HitFly, WrapMode.Once, 0.45f / _hitEffectInfo.FlyTime, 0f);
List<Vector3> path = new List<Vector3>(hitInfo.HitFlyHeightCurve.keys.Length);
float curveTime = hitInfo.HitFlyHeightCurve.keys[hitInfo.HitFlyHeightCurve.keys.Length - 1].time;
for (int i = 0; i < hitInfo.HitFlyHeightCurve.keys.Length; ++i)
{
var key = hitInfo.HitFlyHeightCurve.keys[i];
var lerpValue = key.time / curveTime;
var pos = Vector3.Lerp(RootTrans.position, targetPos, lerpValue);
pos.y += key.value;
path.Add(pos);
}
_hitFlyCurve = iTween.PathControlPointGenerator(path.ToArray());
_hitStateTimer = 0f;
_lieTime = hitInfo.LieTime;
_getUpAnimTime = _animPlayer.GetClipLength(AnimClipNameDefine.GetUp);
_curState = EditorEntityState.HitFly;
}
break;
case SkillHitType.HitGrab:
{
_hitStateTimer = 0f;
_grabOriPos = RootTrans.position;
var vtargetPos = userPos + dir * hitInfo.GrabPos;
vtargetPos.y = 0f;
var grabDir = _grabOriPos - vtargetPos;
grabDir.y = 0f;
grabDir = grabDir.normalized;
if (Vector3.Distance(_grabOriPos, vtargetPos) > hitInfo.GrabDis)
{
_grabTargetPos = vtargetPos + grabDir * hitInfo.GrabPos;
}
else
{
_grabTargetPos = vtargetPos;
}
_animPlayer.Play(_hitEffectInfo.HitAnim, AnimationPartType.AllBody, WrapMode.Once);
_curState = EditorEntityState.HitGrab;
}
break;
}
}
public void Blink(float time, float power, Color color, AnimationCurve curve)
{
_blinkTimer = 0f;
_blinkMaxTime = time;
_blinkPower = power;
_blinkColor = color;
_blinkCurve = curve;
_mater.shader = Shader.Find("Ares/EntityState/BeHit");
_mater.SetColor("_RimColor", _blinkColor);
_mater.SetFloat("_RimPower", (1f - _blinkCurve.Evaluate(0f)) * _blinkPower);
}
public void PlayAnim(string animName, WrapMode wrapMode, float speed, float normalizedTime)
{
if (IsPauseAnim)
{
_animPlayer.Stop();
IsPauseAnim = false;
_runGo.SetActive(false);
}
if (CurState != EditorEntityState.Idle)
{
var curLogicType = FPlayerAnimRelation.GetLogicType(animName);
if (curLogicType == FAnimLogicType.Skill)
{
var runSkillName = FPlayerAnimRelation.SkillIdleToMove(animName);
if (_animPlayer.Play(runSkillName, AnimationPartType.UpBody, wrapMode, true, 0.2f, speed, normalizedTime))
{
return;
}
}
}
_animPlayer.Play(animName, AnimationPartType.AllBody, wrapMode, true, 0.2f, speed, normalizedTime);
}
public void StopAnim()
{
_animPlayer.Stop();
}
public void Update(float dt)
{
_roter.Update(dt);
RootTrans.forward = _roter.CurForward;
_animPlayer.Update(dt);
SkillManager.Update(dt);
if (_blinkMaxTime > 0f && _blinkTimer < _blinkMaxTime)
{
_blinkTimer += dt;
if (_blinkTimer >= _blinkMaxTime)
{
//结束闪烁
_blinkMaxTime = -1f;
_mater.shader = Shader.Find("Ares/Entity/Monster");
_mater.SetColor("_Color", Color.white);
_mater.SetFloat("_ColorMultiplier", 1f);
}
else
{
_mater.SetFloat("_RimPower", (1f - _blinkCurve.Evaluate(_blinkTimer / _blinkMaxTime)) * _blinkPower);
}
}
switch (_curState)
{
case EditorEntityState.Idle:
{
if (!_animPlayer.IsPlaying && !SkillManager.IsUsing)
{
_animPlayer.Play(ObjType == EditorObjType.Player ? AnimClipNameDefine.FightIdle : AnimClipNameDefine.NormalIdle, AnimationPartType.AllBody, WrapMode.Loop);
}
}
break;
case EditorEntityState.Move:
{
if (!_animPlayer.IsPlaying)
{
//_animPlayer.Play(AnimClipNameDefine.FightRunFront, true, WrapMode.Loop);
}
RootTrans.position += _moveDir * dt * _moveSpeed;
if (DisableMove)
{
StopSate();
}
}
break;
case EditorEntityState.Jump:
{
_jumpTimer += dt;
if (_jumpTimer <= JumpTime)
{
float lerpValue = _jumpTimer / JumpTime;
RootTrans.position = (1 - lerpValue) * (1 - lerpValue) * _jumpStart + 2 * lerpValue * (1 - lerpValue) * _jumpCenter + lerpValue * lerpValue * _jumpTarget;
}
else
{
RootTrans.position = _jumpTarget;
_curState = EditorEntityState.Idle;
StopSate();
}
}
break;
case EditorEntityState.HitStiff:
{
_hitStateTimer += dt;
if (_hitStateTimer >= _hitEffectInfo.HitEffectTime)
{
StopSate();
}
}
break;
case EditorEntityState.HitBack:
{
_hitStateTimer += dt;
if (_hitStateTimer >= _hitEffectInfo.HitEffectTime)
{
StopSate();
RootTrans.position = _hitBackTargetPos;
}
else
{
var lerpValue = _hitEffectInfo.HitTimeCurve.Evaluate(_hitStateTimer / _hitEffectInfo.HitEffectTime);
RootTrans.position = Vector3.Lerp(_hitBackOriPos, _hitBackTargetPos, lerpValue);
}
}
break;
case EditorEntityState.HitFly:
{
_hitStateTimer += dt;
if (_hitStateTimer >= _hitEffectInfo.FlyTime)
{
_animPlayer.Play(AnimClipNameDefine.Lie, AnimationPartType.AllBody, WrapMode.Loop);
RootTrans.position = iTween.Interp(_hitFlyCurve, 1f);
_curState = EditorEntityState.Lie;
_hitStateTimer = 0f;
}
else
{
var lerpValue = _hitStateTimer / _hitEffectInfo.FlyTime * _hitEffectInfo.HitTimeCurve.keys[_hitEffectInfo.HitTimeCurve.keys.Length - 1].time;
lerpValue = Mathf.Clamp01(_hitEffectInfo.HitTimeCurve.Evaluate(lerpValue));
RootTrans.position = iTween.Interp(_hitFlyCurve, lerpValue);
}
}
break;
case EditorEntityState.Lie:
{
if (_lieTime > _getUpAnimTime)
{
float value = _lieTime - _getUpAnimTime;
if (_hitStateTimer <= value)
{
_hitStateTimer += dt;
if (_hitStateTimer > value)
{
_animPlayer.Play(AnimClipNameDefine.GetUp, AnimationPartType.AllBody, WrapMode.Once);
}
}
else
{
_hitStateTimer += dt;
if (_hitStateTimer > _lieTime)
{
StopSate();
}
}
}
else
{
_hitStateTimer += dt;
if (_hitStateTimer > _lieTime)
{
StopSate();
}
}
}
break;
case EditorEntityState.HitGrab:
{
_hitStateTimer += dt;
if (_hitStateTimer <= _hitEffectInfo.HitEffectTime)
{
var lerpValue = _hitStateTimer / _hitEffectInfo.HitEffectTime;
RootTrans.position = Vector3.Lerp(_grabOriPos, _grabTargetPos, _hitEffectInfo.HitTimeCurve.Evaluate(lerpValue));
}
else
{
RootTrans.position = _grabTargetPos;
StopSate();
}
}
break;
}
}
public void UseSkill(SkillVisualInfo skill)
{
SkillManager.UseSkill(skill);
}
public void StopAllSkill()
{
SkillManager.StopAllSkill();
}
public void DoPauseAnim(SkillVisualInfo skill, int frame, bool showPauseContrast)
{
if (SkillManager.IsUsing)
return;
if (CurState != EditorEntityState.Idle)
return;
String animName = String.Empty;
int playFrame = 0;
float startNor = 0f;
bool isLoop = false;
for (int i = skill.DataList.Count - 1; i >= 0; --i)
{
var eventInfo = skill.DataList[i];
if (eventInfo.IsEnable && eventInfo.EventType == SkillEventDefine.PlayAnimation && eventInfo.EventFrame <= frame)
{
var animEvent = eventInfo as PlayAnimEventInfo;
animName = animEvent.AnimName;
playFrame = frame - eventInfo.EventFrame;
startNor = animEvent.NormalizedTime;
isLoop = animEvent.Loop != 0;
break;
}
}
var animTime = _animPlayer.GetClipLength(animName);
if (animTime > 0f)
{
var normalizedTime = (playFrame * EditorSkill.OneFrameTime) / animTime;
_animPlayer.Play(animName, AnimationPartType.AllBody, WrapMode.Once, false, 0f, 0f, normalizedTime);
IsPauseAnim = true;
if (showPauseContrast)
{
_runGo.SetActive(true);
_runGo.transform.position = RootTrans.position;
_runGo.transform.forward = RootTrans.forward;
var runAnimName = FPlayerAnimRelation.SkillIdleToMove(animName);
if (!string.IsNullOrEmpty(runAnimName))
{
_animPlayerRun.Play(runAnimName, AnimationPartType.UpBody, WrapMode.Once, false, 0f, 0f, normalizedTime);
_animPlayerRun.Play(AnimClipNameDefine.FightRunFront, AnimationPartType.LowerBody, WrapMode.Once, false, 0f, 0f, normalizedTime);
}
}
else
{
_runGo.SetActive(false);
}
}
}
public bool LoadWeapon(int modelID)
{
var resPath = AssetUtils.GetModelAssetPath(ModelTypeCode.GodWeapon, modelID);
GameObject prefab = ResourcesEx.Load(resPath, typeof(GameObject)) as GameObject;
if (prefab == null)
return false;
for (int i = 0; i < _weaponList.Count; ++i)
{
GameObject.DestroyImmediate(_weaponList[i], true);
}
_weaponList.Clear();
GameObject model = (GameObject)GameObject.Instantiate(prefab);
var leftModel = model.transform.Find("left");
var rightModel = model.transform.Find("right");
if (leftModel != null && rightModel != null)
{
//双手武器
_weaponList.Add(leftModel.gameObject);
_weaponList.Add(rightModel.gameObject);
_weaponList.Add(model);
var slotL = SlotUtils.GetSlotTransform(RootTrans, Slot.LeftWeapon);
leftModel.parent = slotL;
UnityUtils.Reset(leftModel);
var slotR = SlotUtils.GetSlotTransform(RootTrans, Slot.RightWeapon);
rightModel.parent = slotR;
UnityUtils.Reset(rightModel);
model.transform.parent = RootTrans;
}
else
{
//单手武器
_weaponList.Add(model);
var slotR = SlotUtils.GetSlotTransform(RootTrans, Slot.RightWeapon);
model.transform.parent = slotR;
UnityUtils.Reset(model.transform);
}
return true;
}
#endregion
}
}