Esempio n. 1
0
 protected override void Trigger(TriggerType type)
 {
     if (type != Type)
     {
         return;
     }
     if (CameraAnimClip != null)
     {
         Call(new CameraAnimCommand(CameraAnimClip));
     }
     foreach (var anim in TriggerAnims)
     {
         if (anim != null && !anim.isPlaying)
         {
             anim.Play();
         }
     }
     foreach (var anim in StopAnims)
     {
         if (anim != null && anim.isPlaying)
         {
             anim.Stop();
         }
     }
     foreach (var msg in AnimMsgs)
     {
         if (msg.Anim != null && msg.Anim.gameObject != null)
         {
             msg.Anim.Play(msg.State);
             if (msg.KillSelf)
             {
                 AnimKiller killer = msg.Anim.gameObject.AddComponent <AnimKiller>();
                 killer.StateName = msg.State;
             }
         }
     }
     Triggered = true;
 }
Esempio n. 2
0
        public void OnCollectCommand(CollectCommand cmd)
        {
            //Call (new Biz.Gaming.PauseCommand ());
            //View.ItemText.text = cmd.Item.Text;
            //数据更新
            foreach (string s in Model.Items)
            {
                if (s == cmd.Item.ItemName)
                {
                    return;
                }
            }
            Model.Items.Add(cmd.Item.ItemName);
            // 显示ItemTip
            Call(new ShowItemTipCommand(cmd.Item));
            //创建Item特效
            GameObject effect = GameObject.Instantiate(cmd.Item.ItemCollectEffect, cmd.Item.transform.parent);

            effect.transform.position = cmd.Item.transform.position;
            SpriteRenderer renderer = effect.GetComponent <SpriteRenderer>();

            renderer.color = cmd.Item.EffectColor;
            Animator anim = effect.GetComponent <Animator>();

            anim.Play("Collection");
            AnimKiller killer = effect.AddComponent <AnimKiller>();

            killer.StateName = "Collection";
            //触发音效
            AudioSource audio = cmd.Item.Audio;

            if (!audio.isPlaying)
            {
                audio.Play();
            }
        }
Esempio n. 3
0
        //只有在溶入过程结束后还没进入区域的情况不push
        /// <summary>设置溶入状态</summary>
        private void SetMeltStatus(bool meltStatus)
        {
            Model.MeltStatus      = meltStatus;
            Model.LastMeltReqTime = float.MinValue;
            View.PlayerView.NormalEntity.SetActive(!Model.MeltStatus);
            View.PlayerView.MeltedEntity.SetActive(Model.MeltStatus);
            Debug.Log("设置溶入状态:" + meltStatus);
            //修复在ground状态溶入再溶出的问题
            if (meltStatus)
            {
                Model.StayedGround = null;
            }

            if (meltStatus)
            {
                Model.LastMeltTime = Time.fixedTime;
            }
            else
            {
                Model.LastMeltOutTime = Time.fixedTime;
            }
            //特效处理
            if (meltStatus)
            {
            }
            else
            {
                //播放溶出特效
                for (int i = 0; i < 2; i++)
                {
                    GameObject meltOutEffect = GameObject.Instantiate(View.PlayerView.MeltOutEffect, Model.Map.transform);
                    meltOutEffect.transform.position = View.PlayerView.Rigidbody.position;
                    SetMeltEffectRandomEulerAngles(meltOutEffect.transform);
                    SetMeltEffectColor(meltOutEffect.GetComponent <SpriteRenderer>());
                    meltOutEffect.GetComponent <Animator>().Play("Melt_Out");
                    AnimKiller killer = meltOutEffect.AddComponent <AnimKiller>();
                    killer.StateName = "Melt_Out";
                }
            }

            //音效处理
            if (meltStatus)
            {
                PlayAudioClip(View.AudioSetting.MeltInAudioClip);
            }
            else
            {
                PlayAudioClip(View.AudioSetting.MeltOutAudioClip);
            }
            //依附处理
            if (meltStatus)
            {
                foreach (MeltArea meltArea in Model.CurrentStayMeltAreas)
                {
                    IAttachable attachedObject = meltArea.GetComponentInParent <IAttachable>();
                    if (attachedObject != null)
                    {
                        Model.AttachedObject = attachedObject;
                        Model.AttachedObject.OnStartAttached(View.PlayerView.Rigidbody);
                    }
                }
            }
            else
            {
                Model.AttachedObject = null;
            }
            //溶入和溶出时的推力处理
            if (meltStatus)
            {
                MeltArea targetMeltArea = Model.CurrentStayMeltAreas.First.Value;
                //已经相交则不需要推力进入溶入区域
                if (!CheckMeltStatus(targetMeltArea))
                {
                    ColliderDistance2D distance2D = Physics2D.Distance(targetMeltArea.GetComponent <Collider2D>(), View.PlayerView.CenterCollider);
                    Vector2            v0         = GetPushInVelocity(distance2D.normal * distance2D.distance, View.PlayerSetting.MeltInDuration);
                    View.PlayerView.Rigidbody.velocity = View.PlayerSetting.MeltInPushMultiplier * v0; //1.8
                }
            }
            else
            {
                AnimatorStateInfo stateInfo = View.PlayerView.PlayerAnim.GetCurrentAnimatorStateInfo(0);
                //只有在Melted.Idle状态下才推出
                if (stateInfo.fullPathHash == Animator.StringToHash("Base Layer.Melted.Idle"))
                {
                    Debug.Log("推力推出");
                    //View.PlayerView.PlayerAnim.SetTrigger("MeltOut");
                    ColliderDistance2D distance2D = Physics2D.Distance(View.PlayerView.CenterCollider, Model.LastExitMeltArea.GetComponent <Collider2D>());
                    Vector2            pushForce  = GetPushOutForce(distance2D.normal);
                    View.PlayerView.Rigidbody.AddForce(View.PlayerSetting.MeltOutPushMultiplier * pushForce);
                }
            }
            //在溶出操作时插值恢复NormalMoveCollider
            Transform moveTransform = View.PlayerView.NormalMoveCheckCollider.transform;

            moveTransform.localScale = Vector3.zero;
            moveTransform.DOScale(new Vector3(1, 1, 1), View.PlayerSetting.MeltOutDuration);
        }
Esempio n. 4
0
        private void UpdatePlayer()
        {
            PlayerSetting playerSetting = View.PlayerSetting;
            Rigidbody2D   rigidbody     = View.PlayerView.Rigidbody;
            Animator      playerAnim    = View.PlayerView.PlayerAnim;

            playerAnim.SetBool("IsMelted", Model.MeltStatus);
            playerAnim.SetBool("IsGround", IsGroundByCollider());

            //溶入请求计时时间内如果可溶入且状态为非溶入 则进行溶入操作
            if (Time.fixedTime - Model.LastMeltReqTime < playerSetting.MeltJudgeDuration && !Model.MeltStatus && IsMeltAvaliable())
            {
                SetMeltStatus(true);
            }
            //当前是溶入状态且溶入碰撞体离开了可溶入区域 则进行溶出操作 (该判断在溶入彻底成功之后才开始)
            if (Model.MeltStatus && Model.CurrentStayMeltAreas.Count != 0 && !CheckMeltStatus(Model.CurrentStayMeltAreas.First.Value) && Time.fixedTime - Model.LastMeltTime > playerSetting.MeltInDuration + 0.5f * Time.fixedDeltaTime)
            {
                Debug.Log("离开溶入区域自动溶出");
                SetMeltStatus(false);
            }

            //--配置--
            float maxMoveSpeed = 0;
            float moveForce    = 0;
            float linearDrag   = 0;
            float gravity      = 0;
            //--配置--
            Vector2 moveForceDirection = Vector2.zero; //有效移动输入(最后会转为移动动力的输入)

            #region 根据当前状态设置上述配置参数和数据
            if (!Model.MeltStatus)
            {
                //普通状态在地面
                if (IsGroundByCollider())
                {
                    moveForce          = playerSetting.Normal_MoveForce;
                    maxMoveSpeed       = playerSetting.Normal_MaxMoveSpeed;
                    linearDrag         = playerSetting.Normal_LinearDrag;
                    gravity            = playerSetting.GroundGravity;
                    moveForceDirection = GetGroundValidInput(Model.Offset, rigidbody.velocity, maxMoveSpeed);
                }
                //普通状态在空中
                else
                {
                    moveForce    = playerSetting.Air_MoveForce;
                    maxMoveSpeed = playerSetting.Air_MaxMoveSpeed;
                    linearDrag   = playerSetting.Air_LinearDrag;
                    //TODO:有点问题
                    //修正重力加速度抵消空中垂直摩擦力,仅有水平摩擦力生效
                    //目的是让垂直加速度的控制仅受Gravity一个参数影响
                    if (rigidbody.velocity.y > 0)
                    {
                        gravity = playerSetting.Gravity - linearDrag;
                    }
                    else
                    {
                        gravity = playerSetting.Gravity + linearDrag;
                    }
                    moveForceDirection = new Vector2(GetValidInput(Model.Offset.x, rigidbody.velocity.x, maxMoveSpeed), 0);
                }
                //如果有移动力则设置方向
                if (moveForceDirection.x != 0)
                {
                    Vector3 playerScale = View.PlayerView.Player.localScale;
                    View.PlayerView.Player.localScale = moveForceDirection.x > 0 ? new Vector3(Math.Abs(playerScale.x), playerScale.y, playerScale.z) : new Vector3(-1 * Math.Abs(playerScale.x), playerScale.y, playerScale.z);
                }
                //溶出过程中忽略碰撞体(感觉不行)
                // float meltOutProcess = Time.fixedTime - Model.LastMeltOutTime;
                // View.PlayerView.NormalMoveCheckCollider.enabled = meltOutProcess > playerSetting.MeltOutDuration;
            }
            //溶入状态
            else
            {
                moveForce          = playerSetting.Melted_MoveForce;
                maxMoveSpeed       = playerSetting.Melted_MaxMoveSpeed;
                linearDrag         = playerSetting.Melted_LinearDrag;
                gravity            = 0;
                moveForceDirection = GetValidInput(Model.Offset, rigidbody.velocity, new Vector2(maxMoveSpeed, maxMoveSpeed));
                //溶入状态下如果在MeltInDuration后的一帧进行检查 若通过推力仍没有相交(可能受输入的影响) 自动溶出
                float meltProcess = Time.fixedTime - Model.LastMeltTime;

                //依附处理
                if (meltProcess > playerSetting.MeltInDuration && Model.AttachedObject != null)
                {
                    if (!Model.AttachedObject.IsLock())
                    {
                        View.PlayerView.PlayerTransform.position = View.PlayerView.PlayerTransform.position + Model.AttachedObject.CurrentMoveOffset;
                        Debug.Log("位移:" + Model.AttachedObject.CurrentMoveOffset);
                        Model.AttachedObject.OnPlayerMove(moveForceDirection);
                    }
                    else
                    {
                        View.PlayerView.PlayerTransform.position = View.PlayerView.PlayerTransform.position + (Model.AttachedObject as PaperPlane).CurrentVPOffset;
                    }
                }

                //溶入状态移动特效处理
                GameObject meltedMoveEffect = View.PlayerView.MeltedMoveEffect;
                Animator   meltedMoveAnim   = meltedMoveEffect.GetComponent <Animator>();
                bool       showed           = moveForceDirection.magnitude > 0.1f;
                meltedMoveEffect.Active(showed); //速度超过0.1显示特效
                if (showed && !meltedMoveAnim.GetCurrentAnimatorStateInfo(0).IsName("Melt_Walk"))
                {
                    Debug.Log("设置MeltMove动画");
                    SetMeltEffectColor(meltedMoveEffect.GetComponent <SpriteRenderer>());
                    meltedMoveAnim.Play("Melt_Walk");
                }
                //TODO: 根据速度设定特效大小

                //+-0.5帧长 保证仅一次判定
                if (Model.MeltStatus && meltProcess >= playerSetting.MeltInDuration - 0.5f * Time.fixedDeltaTime && meltProcess < playerSetting.MeltInDuration + 0.5f * Time.fixedDeltaTime)
                {
                    if (Model.CurrentStayMeltAreas.Count == 0 || !CheckMeltStatus(Model.CurrentStayMeltAreas.First.Value))
                    {
                        Debug.Log("溶入失败");
                        //Model.CurrentStayMeltAreas.RemoveFirst();;
                        SetMeltStatus(false);
                    }
                    else
                    {
                        Debug.Log("溶入成功");
                        //播放溶入特效
                        for (int i = 0; i < 2; i++)
                        {
                            GameObject meltInEffect = GameObject.Instantiate(View.PlayerView.MeltInEffect, Model.Map.transform);
                            meltInEffect.transform.position = rigidbody.position;
                            SetMeltEffectRandomEulerAngles(meltInEffect.transform);
                            SetMeltEffectColor(meltInEffect.GetComponent <SpriteRenderer>());
                            meltInEffect.GetComponent <Animator>().Play("Melt_In");
                            AnimKiller killer = meltInEffect.AddComponent <AnimKiller>();
                            killer.StateName = "Melt_In";
                        }
                    }
                }
            }
            #endregion

            rigidbody.gravityScale = gravity / (-1 * Physics2D.gravity.y);
            rigidbody.drag         = linearDrag * rigidbody.mass;
            rigidbody.AddForce(moveForceDirection * (moveForce + linearDrag) * rigidbody.mass);
            playerAnim.SetBool("IsMove", moveForceDirection != Vector2.zero);

            //跳跃请求计时时间内如果在地面且状态为非溶入 则进行跳跃操作
            if (Time.fixedTime - Model.LastJumpReqTime < playerSetting.JumpJudgeDuration && !Model.MeltStatus && IsGroundByCollider())
            {
                Model.Jump = true;
            }
            if (Model.Jump)
            {
                rigidbody.velocity     = new Vector2(rigidbody.velocity.x, playerSetting.JumpInitialSpeed);
                Model.Jump             = false;
                rigidbody.drag         = playerSetting.Air_LinearDrag; //跳跃的瞬间帧使用空中阻力和重力
                rigidbody.gravityScale = (playerSetting.Gravity + playerSetting.Air_LinearDrag) / (-1 * Physics2D.gravity.y);
                Model.LastJumpReqTime  = float.MinValue;
                PlayAudioClip(View.AudioSetting.JumpAudioClip);
            }
        }