c# - 出口后浮动上升较慢
问题描述
我想乘以一个浮点数。在统一编辑器中也一切正常,在构建中它突然变慢了。我尝试重新导入所有资产并重新启动我的电脑,但这也无济于事。我试图再次构建它,但没有帮助。我现在不知道该怎么办,有人知道如何解决这个问题吗?这是我的构建输出: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"); ```
解决方案
您所体验的是典型的与帧速率相关的代码。
你做的每一帧
Stamina += fillStamina;
和
Health += fillHealth;
但是,如果在一台设备上每秒有 60 帧,而在另一台较弱的设备上只有 30 帧呢?
在较弱的设备上,提高价值需要两倍的时间。
因此,您应该使用Time.deltaTime
自上一帧渲染以来经过的时间。
通过相乘
X * Time.deltaTime
您将一个值X
从value 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]
;)
推荐阅读
- java - 如何在并发 Java 套接字应用程序中从另一个线程关闭 cline 套接字
- angular - 为什么我的
google-maps-api-3 - 自定义 createPolygon 函数中的 geoXML3“不是 LatLngBounds”错误 - android - 如何检测 Android 中哪些代码在后台使用位置?
- python - 熊猫:计算时间戳和当前时间之间经过的时间,但只有营业时间和时区
- node.js - 节点中的brain.js 训练不使用AWS 上的GPU
- shell - 如何按命名空间/用例对 crontab 作业进行分组?
- django - Django Rest Framework - 在生产模式下删除 API CORS 错误(OVH Web 云)
- excel - Excel - plotting - Dynamic rows & columns (using Name Manager/Formulas)
- flutter - How to hide/show expandable list view through a drop down