private void BindData(Animator attacker, Animator target) { PlayableTrack playableTrack = (PlayableTrack)playableBindingDir["Event Track".GetHashCode()].sourceObject; foreach (var clips in playableTrack.GetClips()) { object asset = clips.asset; if (!(asset is ShowEffectAsset)) { continue; } ShowEffectAsset showEffectAsset = (ShowEffectAsset)asset; showEffectAsset.effectEventReference = new ExposedReference <EffectEvent> { defaultValue = monoBehaviour.GetComponent <EffectEvent>() }; showEffectAsset.eventName = "FrontStabEffect"; } playableTrack = (PlayableTrack)playableBindingDir["Character State Lock".GetHashCode()].sourceObject; foreach (var clips in playableTrack.GetClips()) { if (!(clips.asset is CharacterStateLockAsset)) { continue; } CharacterStateLockAsset characterStateLockAsset = (CharacterStateLockAsset)clips.asset; characterStateLockAsset.attackerAnimator = new ExposedReference <Animator> { defaultValue = attacker }; characterStateLockAsset.receiverAnimator = new ExposedReference <Animator> { defaultValue = target }; } playableTrack = (PlayableTrack)playableBindingDir["Damageable Track".GetHashCode()].sourceObject; foreach (var clips in playableTrack.GetClips()) { if (!(clips.asset is DamageableAsset)) { continue; } DamageableAsset damageableAsset = (DamageableAsset)clips.asset; damageableAsset.damageable = new ExposedReference <Damageable> { defaultValue = target.GetComponent <Damageable>() }; DamageData data = new DamageData() { attacker = attacker.gameObject, damage = monoBehaviour.weapon.damage * 2, damagePos = monoBehaviour.weapon.transform.position, direction = target.transform.position - attacker.transform.position }; damageableAsset.data = data; } }
public override void ExecuteState(StateMachine stateMachine, IState prevState, object param1, object param2) { base.ExecuteState(stateMachine, prevState, param1, param2); mCurrSkillID = (int)param1; mChangeState = false; mSkillInfo = SkillConfig.singleton.GetSkillInfo(mCurrSkillID); if (mSkillInfo == null || mSkillInfo.mTimeline == null) { return; } mTargetRole = mRole.mRoleData.GetTargetRole(); if (Skill.ExecuteSkill(mRole, mTargetRole, mSkillInfo)) { mChangeState = false; } else { StateComplete(); return; } // 获取timeline mDirector = mSkillInfo.mTimeline.GetComponent <PlayableDirector>(); mDirector.Stop(); // 取出timeline 左边的名字进行绑定右边的资源 foreach (PlayableBinding bind in mDirector.playableAsset.outputs) { if (bind.streamName == "Self") { AnimationTrack animationTrack = bind.sourceObject as AnimationTrack; mDuringTime = (float)animationTrack.duration; mBeginTime = Time.fixedTime; mDirector.SetGenericBinding(bind.sourceObject, mAnimator); } else if (bind.streamName == "Target") { mDirector.SetGenericBinding(bind.sourceObject, mTargetRole.mAnimator); mRole.transform.position = -mRole.transform.forward * mSkillInfo.mAtkDistance + mTargetRole.transform.position; mRole.mRoleData.SetForward(mTargetRole.transform.position, mRole.transform.position); mRole.transform.rotation = Quaternion.LookRotation(mRole.mRoleData.GetForward()); mTargetRole.mRoleData.SetForward(mRole.transform.position, mTargetRole.transform.position); mTargetRole.transform.rotation = Quaternion.LookRotation(mTargetRole.mRoleData.GetForward()); } else if (bind.streamName == "SelfEffect") { mDirector.SetGenericBinding(bind.sourceObject, mSkillInfo.mSelfEffect); } else if (bind.streamName == "TargetEffect") { mDirector.SetGenericBinding(bind.sourceObject, mSkillInfo.mTargetEffect); } else if (bind.streamName == "Control Track") { ControlTrack ct = bind.sourceObject as ControlTrack; foreach (var clip in ct.GetClips()) { ControlPlayableAsset playableAsset = clip.asset as ControlPlayableAsset; mDirector.SetReferenceValue(playableAsset.sourceGameObject.exposedName, mRole.gameObject); } } else if (bind.streamName == "Playable Track") { PlayableTrack ct = bind.sourceObject as PlayableTrack; foreach (TimelineClip clip in ct.GetClips()) { PlayableAssetEx playableAsset = clip.asset as PlayableAssetEx; if (playableAsset) { // 1.自定义脚本获取绑定 自定义的变量 playableAsset.mParamAttackTL = this; } } } } mDirector.Play(); // 播放timeline }