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; }
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(); } }
//只有在溶入过程结束后还没进入区域的情况不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); }
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); } }