diff options
-rw-r--r-- | ROUNDS/LevelMapper.cs | 1 | ||||
-rw-r--r-- | ROUNDS/_Player/CharacterData.cs | 11 | ||||
-rw-r--r-- | ROUNDS/_Player/Gravity.cs | 20 | ||||
-rw-r--r-- | ROUNDS/_Player/LegRaycasters.cs | 11 | ||||
-rw-r--r-- | ROUNDS/_Player/PlayerVelocity.cs | 2 |
5 files changed, 34 insertions, 11 deletions
diff --git a/ROUNDS/LevelMapper.cs b/ROUNDS/LevelMapper.cs index 63e1e06..9d0f13e 100644 --- a/ROUNDS/LevelMapper.cs +++ b/ROUNDS/LevelMapper.cs @@ -1,6 +1,7 @@ using System; using UnityEngine; +// 没用 public class LevelMapper : MonoBehaviour { private CharacterData data; diff --git a/ROUNDS/_Player/CharacterData.cs b/ROUNDS/_Player/CharacterData.cs index 561a49b..b52663c 100644 --- a/ROUNDS/_Player/CharacterData.cs +++ b/ROUNDS/_Player/CharacterData.cs @@ -54,6 +54,8 @@ public class CharacterData : MonoBehaviour private bool wasWallGrabLastFrame; + // 从离地开始算的时间(不是着地),着地状态下一直为0 + // 关联到gravity public float sinceGrounded; // 经过测试,isGrounded可以指示是否着地 @@ -257,7 +259,8 @@ public class CharacterData : MonoBehaviour } // 比较重要,但是把isGrounded=true注释掉不影响在地面的移动,会影响腿的渲染 - // 有且只有这个方法设置了 isGrounded = true + // 有且只有这个方法设置了 isGrounded = true, groundPos + // LegRaycaster public void TouchGround(Vector3 pos, Vector3 groundNormal, Rigidbody2D groundRig, Transform groundTransform = null) { //this.gameObject.name = "Player_" + pos.ToString() + "_" + (groundTransform != null ? groundTransform.gameObject.name : "null"); @@ -266,10 +269,12 @@ public class CharacterData : MonoBehaviour { currentJumps = jumps; } + if (TouchGroundAction != null) { TouchGroundAction(sinceGrounded, pos, groundNormal, groundTransform); } + if (groundRig == null) { standOnRig = null; @@ -278,6 +283,7 @@ public class CharacterData : MonoBehaviour { standOnRig = groundRig; } + if (playerVel.velocity.y < -20f && !isGrounded) { for (int i = 0; i < landParts.Length; i++) @@ -289,10 +295,11 @@ public class CharacterData : MonoBehaviour } GamefeelManager.instance.AddGameFeel(Vector2.down * Mathf.Clamp((sinceGrounded - 0.5f) * 1f, 0f, 4f)); } + groundPos = pos; wasGroundedLastFrame = true; isGrounded = true; - sinceGrounded = 0f; + sinceGrounded = 0f; // 很重要,如果注释掉会让角色无阻碍穿过地面 } public void TouchWall(Vector2 normal, Vector3 pos) diff --git a/ROUNDS/_Player/Gravity.cs b/ROUNDS/_Player/Gravity.cs index 0c8b459..5e51441 100644 --- a/ROUNDS/_Player/Gravity.cs +++ b/ROUNDS/_Player/Gravity.cs @@ -19,19 +19,29 @@ public class Gravity : MonoBehaviour private void FixedUpdate() { - float num = data.sinceGrounded; - if (data.sinceWallGrab < num) + float num = data.sinceGrounded;// 从离地开始算的时间(不是着地),着地状态下一直为0 + if (data.sinceWallGrab < num) { num = data.sinceWallGrab; } + + Vector3 gravity = Vector3.zero; + // 施加向下的重力 if (num > 0f) { - rig.AddForce(Vector3.down * TimeHandler.timeScale * Mathf.Pow(num, exponent) * gravityForce * rig.mass, ForceMode2D.Force); + gravity = Vector3.down * TimeHandler.timeScale * Mathf.Pow(num, exponent) * gravityForce * rig.mass; + rig.AddForce(gravity, ForceMode2D.Force); } else { - rig.AddForce(Vector3.down * TimeHandler.timeScale * num * gravityForce * rig.mass, ForceMode2D.Force); + gravity = Vector3.down * TimeHandler.timeScale * num * gravityForce * rig.mass; + rig.AddForce(gravity, ForceMode2D.Force); } - } + + // 着地状态下gravity为0,0,0 + + //this.gameObject.name = "Player_" + gravity; + + } } diff --git a/ROUNDS/_Player/LegRaycasters.cs b/ROUNDS/_Player/LegRaycasters.cs index 4426342..fa3066e 100644 --- a/ROUNDS/_Player/LegRaycasters.cs +++ b/ROUNDS/_Player/LegRaycasters.cs @@ -35,8 +35,9 @@ public class LegRaycasters : MonoBehaviour data = GetComponentInParent<CharacterData>(); } - //! 重要,这个代码会让角色站在地面上,不会陷下去 + //! 重要,这个代码会让角色站在地面上,不会陷下去(属于模拟跑步时一上一下的附加效果,主要还是要看playercollision的fixedupdate) // 和PlayerCollision的FixedUpdate代码配合 + // 关键代码是TouchGround,addforce不关键 private void FixedUpdate() { totalStepTime = 0f; @@ -61,19 +62,23 @@ public class LegRaycasters : MonoBehaviour } } + // 向上施加一个力,让身体离开地面,高于腿,模拟跑步时一上一下 private void HitGround(Transform leg, RaycastHit2D hit) { if (!(data.sinceJump < 0.2f) && !(Vector3.Angle(Vector3.up, hit.normal) > 70f)) { + // touch ground 很重要 data.TouchGround(hit.point, hit.normal, hit.rigidbody); + + // 施加向上的力 Vector3 vector = ((Vector3)hit.point - leg.transform.position) / base.transform.root.localScale.x; if (data.input.direction.x != 0f) { vector.y += wobbleCurve.Evaluate(totalStepTime) * base.transform.root.localScale.x; rig.AddForce(Vector3.up * forceCurve.Evaluate(totalStepTime) * rig.mass); } - rig.AddForce(animationCurve.Evaluate(Mathf.Abs(vector.y)) * Vector3.up * rig.mass * force); - rig.AddForce(animationCurve.Evaluate(Mathf.Abs(vector.y)) * (0f - rig.velocity.y) * Vector2.up * rig.mass * drag); + rig.AddForce(animationCurve.Evaluate(Mathf.Abs(vector.y)) * Vector3.up * rig.mass * force);//一个垂直向上的力 + rig.AddForce(animationCurve.Evaluate(Mathf.Abs(vector.y)) * (0f - rig.velocity.y) * Vector2.up * rig.mass * drag);//一个垂直想让的阻力 } } } diff --git a/ROUNDS/_Player/PlayerVelocity.cs b/ROUNDS/_Player/PlayerVelocity.cs index 9355a5d..8d07513 100644 --- a/ROUNDS/_Player/PlayerVelocity.cs +++ b/ROUNDS/_Player/PlayerVelocity.cs @@ -57,7 +57,7 @@ public class PlayerVelocity : MonoBehaviour } // 静止的时候速度为0,0 - this.gameObject.name = "Player_" + bAsign + "_"+ velocity + "_"+ preVel; + // this.gameObject.name = "Player_" + data.sinceGrounded + "_"+ bAsign + "_"+ velocity + "_"+ preVel; } internal void AddForce(Vector2 force, ForceMode2D forceMode) |