Проблемы со ссылкой на значение - PullRequest
0 голосов
/ 19 июня 2020

Я не хочу создавать сценарий стрельбы, ссылающийся на сценарий боеприпасов, который я сделал ранее. Я не хочу, чтобы сценарий стрельбы стрелял только тогда, когда боеприпасы равны или меньше максимального количества боеприпасов, но их больше 0. Я попытался сделать боеприпасы и максимальные боеприпасы как publi c stati c int в сценарии боеприпасов и частный stati c int в сценарии съемки, но похоже, что это не работает. Есть ли проблема с рефренсом или проблема с самим скриптом.

Боеприпасы:

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

public class Ammo : MonoBehaviour
{
    public static int Ammocount;
    public static int Maxammo;
    public float Magazines;
    public Text AmmoCounter;
    public Text MagazinesUI;
    private string AmmointoString;
    private string MagazinesintoString;

    // Start is called before the first frame update
    void Start()
    {
        Ammocount = 6;
        Maxammo = 6;
        Magazines = 10;
    }

    // Update is called// once per frame
    void Update()
    {
        // Transforms a int into a string and also it makes the ammo a part of the UI    
        MagazinesintoString = Magazines.ToString();
        AmmointoString = Ammocount.ToString();
        AmmoCounter.text = AmmointoString;
        MagazinesUI.text = MagazinesintoString;

        //If you have ammo and you press mouse one ammo deacreses and if you have less than 6 bullets you 
        if (Ammocount <= Maxammo && Input.GetButtonDown("Fire1") && Ammocount > 0)
        {
            Ammocount -= 1;
        }
        else if (Ammocount < Maxammo)
        {
            if (Input.GetKeyDown("r") && Magazines > 0)
            {
                Ammocount = 6;
                Magazines -= 1;
            }
        }
    }
}

Скрипт оружия:

using UnityEditor;
using UnityEngine;

public class Gunscript : MonoBehaviour
{
    public float Damage = 10f;
    public float Range = 100f;
    public ParticleSystem muzzleflash;
    public Camera Fpscam;
    private AudioSource gunshot;
    public GameObject Pistol;
    private static int ammo;
    private static int maxammo;

    void Start()
    {
        ammo = Ammo.Ammocount;
        maxammo = Ammo.Maxammo;
        gunshot = GetComponent<AudioSource>();
    }

    // Update is called once per frame
    void Update()
    {

        if (Input.GetButtonDown("Fire1") && ammo <= maxammo && ammo > 0)
        {
            muzzleflash.Play();
            Shoot();
            gunshot.Play(0);
        }

        void Shoot()
        {
            RaycastHit hit;
            if (Physics.Raycast(Fpscam.transform.position, Fpscam.transform.forward, out hit, Range))
           {
                Debug.Log(hit.transform.name);

                Target target = hit.transform.GetComponent<Target>();
                if (target != null)
                {
                    target.TakeDamage(Damage);
                }
           }
        }
    }
}

1 Ответ

2 голосов
/ 19 июня 2020

int - это тип VALUE ... не ссылка ... поэтому обновление значения в классе Ammo не обновляет его автоматически для Gunscript class!

Вам лучше удалить свои локальные поля из Gunscript

<del>private static int ammo;
private static int maxammo;
</del>

и напрямую использовать

// Afaik comparing the int is cheaper then getting Input
// You should do the cheaper checks first
if (Ammo.Ammocount <= Ammo.Maxammo && Ammo.Ammocount > 0 && Input.GetButtonDown("Fire1"))
{
    muzzleflash.Play();
    Shoot();
    gunshot.Play(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...