Exemple #1
0
        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;
            }
        }
Exemple #2
0
    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
    }