首页 > 解决方案 > 出口后浮动上升较慢

问题描述

我想乘以一个浮点数。在统一编辑器中也一切正常,在构建中它突然变慢了。我尝试重新导入所有资产并重新启动我的电脑,但这也无济于事。我试图再次构建它,但没有帮助。我现在不知道该怎么办,有人知道如何解决这个问题吗?这是我的构建输出:https://i.stack.imgur.com/ry5PI.png 代码:

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class PlayerController : MonoBehaviour
{
    [Header("")]
    [Header("Move Settings")]
    [Header("")]
    public float MovementSpeed = 5f;
    public float SprintSpeed = 7f;
    public float JumpForce = 5f;
    public float minJumpForce = 3f;
    [Header("")]
    [Header("Stamina Settings")]
    [Header("")]
    public float fillStamina = 1f;
    public float MaxStamina = 10000f;
    public float Stamina = 10000f;
    public Slider staminaBar;
    public GameObject SliderFill;
    public GameObject SliderB;
    [Header("")]
    [Header("Health Settings")]
    [Header("")]
    public float fillHealth = 1f;
    public float MaxHealth = 100f;
    public float Health = 100f;
    public Slider HealthBar;
    [Header("")]
    [Header("Player Settings")]
    [Header("")]
    Rigidbody2D body;
    public static PlayerController instance;
    public GameObject DeathObj;
    float horizontal;
    float vertical;



    private Rigidbody2D _rigidbody;
    private bool Sprint = false;
    //private bool ActivateLowStamina = false;
    //private bool LowStamina = false;

    
    private float move;

    private void Awake()
    {
        instance = this;
    }

    void Start()
    {
        _rigidbody = GetComponent<Rigidbody2D>();
        //body = GetComponent<Rigidbody2D>();
        Stamina = MaxStamina;
        staminaBar.maxValue = MaxStamina;
        staminaBar.value = MaxStamina;
        HealthBar.maxValue = MaxHealth;
        HealthBar.value = MaxHealth;
        //ActivateLowStamina = false;
        //lowTxt.gameObject.SetActive(false);
    }

    void Update()
    {
        horizontal = Input.GetAxisRaw("Horizontal");
        vertical = Input.GetAxisRaw("Vertical");
        //transform.rotation = Quaternion.identity;
        staminaBar.value = Stamina;
        HealthBar.value = Health;
        //var movement = Input.GetAxis("Horizontal");

        if (Health < 1)
        {
            Die();
        }

        if (Stamina <= 0)
        {
            Stamina = 0;
        }
        if(Health <= 0)
        {
            Health = 0;
        }

        if (Stamina < 3000)
        {
            SliderFill.GetComponent<Image>().color = new Color32(213, 217, 0, 255);
            SliderB.GetComponent<Image>().color = new Color32(11, 217, 0, 47);
        }
        else
        {
            SliderFill.GetComponent<Image>().color = new Color32(11, 217, 0, 255);
            SliderB.GetComponent<Image>().color = new Color32(0, 255, 12, 47);
        }

        

        if (Input.GetKey("left shift"))
        {
            Sprint = true;
        }

        //if(Stamina < 100)
        //{
        //    ActivateLowStamina = false;
        //}
        //else
        //{
        //    ActivateLowStamina = true;
        //}

        //if(ActivateLowStamina == true)
        //        {
        //            lowTxt.gameObject.SetActive(true);
        //        }


        



        if (Mathf.Abs(_rigidbody.velocity.x) == 0f && Stamina < MaxStamina && Mathf.Abs(_rigidbody.velocity.y) == 0f)
        {
            Stamina += fillStamina;
        }
        Health += fillHealth;




        if (Input.GetButtonDown("Jump") && Mathf.Abs(_rigidbody.velocity.y) < 0.001f) {
            if(Stamina > 10)
            {
            _rigidbody.AddForce(new Vector2(0, JumpForce), ForceMode2D.Impulse);
            //_rigidbody.AddForce(Vector2.up * JumpForce);
                UseStamina(700);
            }
            else
            {
                _rigidbody.AddForce(new Vector2(0, minJumpForce), ForceMode2D.Impulse);
                //_rigidbody.AddForce(Vector2.up * JumpForce);
                UseStamina(300);
            }
            
        }
        
    }

    public void UseStamina(float amount)
    {

            if (Stamina - amount >= 0)
            {
                Stamina -= amount;
            }

        

    }

    private void FixedUpdate()
    {

        move = Input.GetAxis("Horizontal");

        if (Sprint == true && Stamina > 10)
                    {
                     _rigidbody.velocity = new Vector2(move * SprintSpeed, _rigidbody.velocity.y);
                    if (Mathf.Abs(_rigidbody.velocity.x) != 0f)
                    {
                        UseStamina(10);
                    }

            
                        Sprint = false;
            

                    }
                    else
                    {
                        
                            if (Stamina > 10)
                            {
                                _rigidbody.velocity = new Vector2(move * MovementSpeed, _rigidbody.velocity.y);
                                if(Mathf.Abs(_rigidbody.velocity.x) != 0f)
                                {
                                    UseStamina(2f);
                                }
                                
                            }
                            else
                            {
                                _rigidbody.velocity = new Vector2(move * 1f, _rigidbody.velocity.y);
                            }
                        

                    }
        //if(Mathf.Abs(_rigidbody.velocity.x) != 0f)
            //{
            //Stamina -= 1;
            //}

        
    }

    

    public void Die()
    {
        if(Health < 1)
        {
            Time.timeScale = 0;
            DeathObj.SetActive(true);
            //SceneManager.LoadScene(SceneManager.GetActiveScene().name);
        }
    }
}
//_rigidbody.velocity = new Vector2(horizontal * MovementSpeed, vertical * SprintSpeed);
            //transform.position += new Vector3(movement, 0, 0) * Time.deltaTime * SprintSpeed;
            //transform.Translate(new Vector3(-3f, 0, 0) * Time.deltaTime);
            //_rigidbody.velocity = new Vector2(MovementSpeed, 0);
            //_rigidbody.AddForce(new Vector2(MovementSpeed, MovementSpeed));
//transform.position += new Vector3(movement, 0, 0) * Time.deltaTime * MovementSpeed;
                //_rigidbody.velocity = new Vector2(horizontal * MovementSpeed, vertical * MovementSpeed);
                //transform.position += new Vector3(movement, 0, 0) * Time.deltaTime * 3f;

            //body.velocity = new Vector2(horizontal * MovementSpeed, vertical * MovementSpeed);
        //var movement = Input.GetAxis("Horizontal"); ```

标签: c#visual-studiounity3d

解决方案


您所体验的是典型的与帧速率相关的代码。

你做的每一

Stamina += fillStamina;

Health += fillHealth;

但是,如果在一台设备上每秒有 60 帧,而在另一台较弱的设备上只有 30 帧呢?

在较弱的设备上,提高价值需要两倍的时间。

因此,您应该使用Time.deltaTime自上一帧渲染以来经过的时间。

通过相乘

X * Time.deltaTime

您将一个值Xvalue per frame转换value per second为现在独立于设备容量和帧速率的值。在所有设备上,它现在总是以秒为单位花费相同的有效时间。

您当然必须调整您的价值观,但通常您会这样做

Stamina += fillStaminaPerSecond * Time.deltaTime;

并相应地

Health += fillHealthPerSecond * Time.deltaTime;

因此也适用于连续使用

UseStamina(10 * Time.deltaTime);

UseStamina(2f * Time.deltaTime);

如前所述,您可能必须调整这些值,因为现在它们或多或少取决于60(无论帧速率是多少)。

但是,对于跳转的单个事件调用,您不需要/不需要,Time.deltaTime因为这些不是连续调用。


GetComponent顺便说一句,与其一遍又一遍地使用,不如在其中执行一次,Awake或者Start将引用存储在一个字段中,然后再重用它!

而不是

[Header("")]

你可能更应该使用

[Space]

;)


推荐阅读