在 Unity 2D 自顶向下项目中潇洒

问题描述 投票:0回答:1

因此,在 3D 游戏中,我使用 .AddForce(dashForce, ForceMode.Impulse) 来计算和执行 Dash-Function(它的工作方式非常神奇)。然而,当我将我所知道的一切转化为 2D 世界时(因此使用 Vector2 dashForce 并使用 ForceMode2D),有些东西无法正常工作。


    public class NewBehaviourScript : MonoBehaviour
    {
        [Header ("Running Values and bools")]
        private float vertical;
        private float horizontal;
        private float speed = 10f;
        private bool isFacingRight = true;

        [Header("Sprint")]
        private bool canSprint = true;
        public float sprintFactor = 5f;
        

        [SerializeField] private Rigidbody2D rb;
        [SerializeField] private Transform groundCheck;
        [SerializeField] private LayerMask hakenCheck;
        [SerializeField] private LayerMask groundLayer;


        [Header("Dash Mechanic")]
        private bool canDash = true;
        private bool isDashing = false;
        public float DashCoolDown = 1f;
        public float DashDuration = 1f;
        private float DashFactorFront = 8f;
        
        [SerializeField] TrailRenderer tr;

        private void Start()
        {
            rb = GetComponent<Rigidbody2D>();
           
        }

        void Update()
        { 

            if (canDash && !isDashing && Input.GetKey(KeyCode.C))
            {
                StartCoroutine(Dash());
            }

        }

        private void FixedUpdate()
        {
            float horizontal = Input.GetAxisRaw("Horizontal");
            float vertical = Input.GetAxisRaw("Vertical");

            rb.velocity = new Vector2(horizontal, vertical).normalized * speed;

               //sprinting - tr emitting
            if (canSprint == true && Input.GetKey(KeyCode.LeftShift))
            {
                rb.velocity = new Vector2(horizontal, vertical).normalized * speed * sprintFactor ;
                

            }

        }

        private IEnumerator Dash()
        {
            Debug.Log("Dash");
            canDash = false;
            isDashing = true;

            if (rb.velocity.x > rb.velocity.y || rb.velocity.x == rb.velocity.y)
            {
                Vector2 dashForce = rb.transform.right * DashFactorFront;
                rb.AddForce(dashForce, ForceMode2D.Impulse);

                yield return new WaitForSeconds(DashDuration);
                isDashing = false;
                yield return new WaitForSeconds(DashCoolDown);
                canDash = true;
            }
            else if (rb.velocity.y > rb.velocity.x)
            {
                Vector2 dashForce = rb.transform.up * DashFactorFront;
                rb.AddForce(dashForce, ForceMode2D.Impulse);

                yield return new WaitForSeconds(DashDuration);
                isDashing = false;
                yield return new WaitForSeconds(DashCoolDown);
                canDash = true;
            }
        }
     
        }

到目前为止我所知道的是协程被执行(通过使用 Debug.Log 消息进行测试以及我实现的冷却时间进行检查)。因此,破折号函数/计算似乎有问题/我有一个错误的想法。我什至尝试使用不同的力模式,尽管我认识到似乎只有“力”和“脉冲”(这些都不适合我)。

我认为可能的一件事是,我必须使用空作为玩家内部玩家的子元素,并对空本身施加力,但是,即使我用不同的空尝试了两次,这也还没有解决。对象。所以,到最后我还是不知道这个问题的根源在哪里。在我提供的解决方案中,我只是返回使用 RigidBody 作为所用轴 (x,y) 的源并向它们施加力。

c# unity-game-engine 2d game-physics 2d-games
1个回答
0
投票

FixedUpdate
中,您直接设置
Rigidbody
的速度,这会撤消您在
Dash
中进行的任何力设置。从表面上看,您正在尝试限制
Rigidbody
可以移动的最大速度,请通过调用以下命令尝试此操作:

rb.velocity = Vector2.ClampMagnitude(rb.velocity, YOUR_MAX_SPEED);

而不是你拥有的:

rb.velocity = new Vector2(horizontal, vertical).normalized * speed;

顺便说一句,您也根本没有使用您的字段

vertical
horizontal
isFacingRight
。目前您有:

float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");

如果玩家掉落或被另一个人推挤,会将玩家冻结在空中

RigidBody
/
Collider2D

希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.