首页 > 解决方案 > 玩家瞬间卡在屏幕边缘!统一

问题描述

我正在开发一个 Unity 2d 游戏,该游戏围绕一个玩家在飞行时躲避随机物体......就像 flappybird 之类的东西。游戏工作正常。

但问题是当玩家触摸顶部屏幕边缘并继续施加力量时,玩家会在边缘卡住一段时间。我想我需要在玩家触摸屏幕边缘时禁用增加力。我希望你们帮助我。这是播放器代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Jetpack: MonoBehaviour
{
    public GameManager GameManager;
    private Rigidbody2D rb;
    private float jumpForce = 40f;
    private bool engineIsOn;

    [SerializeField] private GameObject fire;

    void Start()
    {
        engineIsOn = false;
        fire.SetActive(false);
        rb = GetComponent<Rigidbody2D>();
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            engineIsOn = true;
            fire.SetActive(true);
        }
        else
        {
            engineIsOn = false;
            fire.SetActive(false);
        }


        transform.position = new Vector3(Mathf.Clamp(transform.position.x, -4.5f, 4.5f),
        Mathf.Clamp(transform.position.y, -4.5f, 4.5f), transform.position.z);

        
    }
    private void FixedUpdate()
    {
        switch (engineIsOn)
        {
            case true:
                rb.AddForce(new Vector2(0f, jumpForce),ForceMode2D.Force);
                break;

            case false:
                rb.AddForce(new Vector2(0f, 0f), ForceMode2D.Force);
                break;
        }
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {

        GameManager.gameover();
    }
}

标签: c#unity3d

解决方案


每当处理Rigidbody然后不要通过Transform组件设置任何值!

这可能会破坏物理学。

然后基本上你已经说过了:如果你在边缘,不要增加更多的向上力量。

作为一个简单的技巧,您可以在撞击边缘时将 Y 速度设置为 0,例如

private void FixedUpdate()
{
    // Very unusual to use a switch for a single bool
    if (engineIsOn)
    {
        rb.AddForce(new Vector2(0f, jumpForce),ForceMode2D.Force);
    }
    // This does absolutely nothing
    // Adding a force of 0,0 doesn't change the velocity at all ...
    //else
    //{
    //    rb.AddForce(new Vector2(0f, 0f), ForceMode2D.Force);
    //}

    // Check if currently hitting an edge
    // and if so set the velocity on that axis to 0
    // also clamp the position then
    var velocity = rb.velocity;
    var position = rb.position;
    if(Mathf.Abs(rb.position.x) >= 4.5f)
    {
        velocity.x = 0;
        position.x = Mathf.Clamp(position.x, -4.5f, 4.5f);
    }
    if(Mathf.Abs(rb.position.y) >= 4.5f) 
    {
        velocity.y = 0;
        position.y = Mathf.Clamp(position.y, -4.5f, 4.5f);
    }
    rb.velocity = velocity;
    rb.position = position;
}

推荐阅读