public static void AddInstanceControllerAction(IPCharacterInstance instance, PControllerActionType actionType) { if (actionType == PControllerActionType.JUMP) { instance.Controller.Actions.Clear(); } instance.Controller.Actions.Add(actionType); }
///<summary> ///Will prevent the character from keep walking towards the wall ///</summary> public static void BreakControllerWhenFacingWall(IPCharacterInstance instance, LayerMask targetLayer, float detectorDistance = 1f) { Vector2 detectorPos = instance.RenderObject.transform.position; detectorPos.y += instance.RenderObject.transform.localScale.x / 2; float direction = (instance.Render.flipX) ? -1 : 1; Debug.DrawRay(detectorPos, Vector2.right * detectorDistance * direction, Color.red); instance.Controller.isWallFacing = Physics2D.Raycast(detectorPos, Vector2.right * direction, detectorDistance, targetLayer); }
public static void UpdateInstanceAnimation(IPCharacterInstance instance) { if (instance.CurrentAnimation.Clip.PFrames.Length == 0) { PCharacterInstanceEcxepection.PlayingAnimationWithoutFramesException((PCharacterInstance)instance); return; } if (instance.CurrentAnimation.Clip.PFrames.Length == 0) { string firstFrameName = instance.CurrentAnimation.Clip.PFrames[0].FrameName; instance.Render.sprite = instance.Base.CharacterAtlas.GetSprite(firstFrameName); return; } instance.CurrentAnimation.Time += Time.deltaTime * instance.Base.Configuration.FrameSpeedMultiplier; if (instance.CurrentAnimation.Time >= instance.Base.Configuration.DelayToNextFrame) { instance.CurrentAnimation.Time = 0; instance.CurrentAnimation.CurrentFrame += instance.CurrentAnimation.FrameModifier; if (instance.CurrentAnimation.Clip.AnimationType == PAnimationType.NORMAL) { instance.CurrentAnimation.FrameModifier = 1; } else { if (instance.CurrentAnimation.CurrentFrame < 0 || instance.CurrentAnimation.CurrentFrame >= instance.CurrentAnimation.Clip.PFrames.Length) { instance.CurrentAnimation.FrameModifier *= -1; instance.CurrentAnimation.CurrentFrame += instance.CurrentAnimation.FrameModifier; } } if (instance.CurrentAnimation.CurrentFrame >= instance.CurrentAnimation.Clip.PFrames.Length) { instance.CurrentAnimation.CurrentFrame = 0; } else if (instance.CurrentAnimation.CurrentFrame < 0) { instance.CurrentAnimation.CurrentFrame = instance.CurrentAnimation.Clip.PFrames.Length - 1; } } int currentFrame = instance.CurrentAnimation.CurrentFrame; string frameName = instance.CurrentAnimation.Clip.PFrames[currentFrame].FrameName; instance.Render.sprite = instance.Base.CharacterAtlas.GetSprite(frameName); }
///<summary> ///Flip PCharacterInstance render sprite in X using TRANSLATE_LEFT or TRANSLATE_RIGHT ///<summary> public static void FaceToMoveDirection(IPCharacterInstance instace) { var curAction = instace.Controller.CurrentAction; switch (curAction) { case PControllerActionType.TRANSLATE_LEFT: instace.Render.flipX = true; break; case PControllerActionType.TRANSLATE_RIGHT: instace.Render.flipX = false; break; } }
///<summary> ///Set to an animation to a given PCharacterInstance ///</summary> public static void SetInstanceAnimation(IPCharacterInstance instance, string animation) { if (instance.CurrentAnimation.Clip.Name == animation) { return; } for (int i = 0; i < instance.Base.Animations.Length; i++) { var curBaseAnimation = instance.Base.Animations[i]; if (curBaseAnimation.Name == animation) { instance.CurrentAnimation.Clip = curBaseAnimation; instance.CurrentAnimation.Time = 0; instance.CurrentAnimation.CurrentFrame = 0; } } }
public static PControllerActionType UpdateInstanceController(IPCharacterInstance instance, float moveSpeed, float jumpForce, bool faceToWalkDirection = true) { if (instance.Controller.Actions.Count > 0) { var curAction = instance.Controller.Actions[0]; Transform instanceTransform = instance.Transform; switch (curAction) { case PControllerActionType.TRANSLATE_RIGHT: if (!instance.Controller.isWallFacing) { instanceTransform.Translate(Vector2.right * moveSpeed * Time.deltaTime); } break; case PControllerActionType.TRANSLATE_LEFT: if (!instance.Controller.isWallFacing) { instanceTransform.Translate(Vector2.left * moveSpeed * Time.deltaTime); } break; case PControllerActionType.JUMP: instance.Rig.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse); break; } instance.Controller.CurrentAction = curAction; instance.Controller.Actions.RemoveAt(0); if (faceToWalkDirection) { FaceToMoveDirection(instance); } return(curAction); } instance.Controller.CurrentAction = PControllerActionType.NONE; return(PControllerActionType.NONE); }