我正在为PlayerController创建一个重装脚本。我正在遵循Brackey的指南:https://www.youtube.com/watch?v=kAx5g9V5bcM。他的方法使用IEnumerators和WaitForSeconds来增加重新加载时间。简而言之,我在产量之前记录“重新加载”,在产量之后记录“重新加载”。但是,我同时得到“重新加载”和“重新加载”。
我尝试增加装弹时间,以防时间太短,但没有任何效果。
这是我班的内部。我没有任何错误。
public float speed;
private Rigidbody2D rb;
private Vector2 moveVelocity;
public GameObject bullet;
public GameObject shootPoint;
//public float ammo = 6;
//[HideInInspector] public bool reloading = false;
//[SerializeField] private float reloadTime = 3;
//private float reloadState;
public int maxAmmo = 10;
private int currentAmmo;
public float reloadTime = 100f;
private bool isReloading = false;
public float health = 50f;
void Start()
{
rb = GetComponent<Rigidbody2D>();
health = 50;
currentAmmo = maxAmmo;
}
void Update()
{
Vector2 moveInput = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
moveVelocity = moveInput * speed;
if (isReloading) {
return;
}
if (currentAmmo <= 0) {
StartCoroutine(Reload());
return;
}
if (Input.GetButtonUp("Shoot")) {
Instantiate(bullet, shootPoint.transform.position, Quaternion.identity);
currentAmmo--;
}
}
void FixedUpdate()
{
rb.MovePosition(rb.position + moveVelocity * Time.fixedDeltaTime);
}
void OnTriggerEnter2D(Collider2D other) {
if(other.gameObject.tag == "Bullet") {
health--;
//Debug.Log("Player 1 Health: " + health);
Destroy(other.gameObject);
}
}
IEnumerator Reload()
{
Debug.Log("reloading");
isReloading = true;
yield return new WaitForSeconds(reloadTime);
currentAmmo = maxAmmo;
isReloading = false;
Debug.Log("reloaded");
}
正如我所说,我没有收到任何错误。我希望我不能射击一秒钟,但是我可以射击并且重新加载不需要一秒钟。
答案 0 :(得分:2)
您已声明
public float reloadTime = 100f;
public
字段由Unity Inspector自动序列化(“存储”)。
我的猜测是,一开始您是这样声明
public float reloadTime;
因此,Unity Inspector用默认值0
存储了它。然后,稍后您尝试从脚本中增加该值。
以后在脚本中更改初始值 不会产生任何效果。 Unity Inspector将始终用序列化的值覆盖该值。
为了从现在开始更改您的值,您总是必须使用Inspector进行设置,不对字段进行序列化(例如通过使其private
)或在Awake
中进行设置,或者Start
方法将再次覆盖检查器值。