public void PlayAnimation(string actionName, bool isClearOldActionInfo = true, Action hitHandler = null, Action endHandler = null) { if (currentActionName == actionName) { return; } StopActionSound(); if (isClearOldActionInfo) { StopOldActionEffect(currentActionName); } TimerManager.RemoveHandler(timerInfo); timerInfo = null; OnActionEndHandler = null; if (Model != null && characterConfigInfo != null) { currentActionName = actionName; currentActionInfo = characterConfigInfo.GetActionInfo(currentActionName); if (currentActionInfo != null) { bool loop = AnimationType.IsLoopAction(currentActionName); if (currentActionInfo.SelfMoveTime > 0f && currentActionInfo.SelfMoveDistance > 0f && currentActionInfo.IsLoop) { OnActionEndHandler = endHandler; timerInfo = TimerManager.AddDelayHandler(OnEndHandler, currentActionInfo.SelfMoveDelayTime + currentActionInfo.SelfMoveTime, 1); Model.PlayAnimation(currentActionName, currentActionInfo.PlaySpeed, hitHandler, null); } else { Model.PlayAnimation(currentActionName, currentActionInfo.PlaySpeed, hitHandler, endHandler); } PlayActionSound(currentActionInfo.SoundName, loop, (ulong)currentActionInfo.SoundPlayDelayTime); for (int i = 0; i < currentActionInfo.ActionEffectInfos.Count; ++i) { EffectInfo effectInfo = currentActionInfo.ActionEffectInfos[i]; if (effectInfo.EffectType == EffectTypes.Bullet) { continue; } if (effectInfo.EffectType == EffectTypes.Normal && effectInfo.BindType == BindTypes.Bone && (effectInfo.BindName == BindTypes.NONE || string.IsNullOrEmpty(effectInfo.BindName))) { continue; } NEffect nEffect = GetEffect(effectInfo); GameObject effect = nEffect.GetEffect(); if (effect == null) { continue; } if (effectInfo.BindType == BindTypes.OrginePoint) { //自身同坐标,且随自身一起移动 if (Container != null) { effect.transform.SetParent(Container.transform); effect.transform.localPosition = Vector3.zero; effect.transform.localScale = Vector3.one; effect.transform.localRotation = Quaternion.identity; } } else if (effectInfo.BindType == BindTypes.Self_Point) { //自身同坐标,且不随自身一起移动 if (Container != null) { effect.transform.SetParent(null); effect.transform.localPosition = Vector3.zero; effect.transform.localScale = Vector3.one; effect.transform.localRotation = Quaternion.identity; effect.transform.position = GetPosition(); effect.transform.eulerAngles = new Vector3(0f, Container.transform.eulerAngles.y, 0f); } } else if (effectInfo.BindType == BindTypes.Bone) { //绑骨骼 Transform bone = Model.GetChild(effectInfo.BindName); if (bone != null) { effect.transform.SetParent(bone); effect.transform.localPosition = Vector3.zero; effect.transform.localScale = Vector3.one; effect.transform.localRotation = Quaternion.identity; } } nEffect.Play(); } } } }