Я действительно борюсь с созданием системы разблокировки оружия / предметов через игровой магазин. Игрок должен иметь возможность выбирать оружие только по индексам, которые были разблокированы или куплены.
Я потратил два дня на лучший способ добиться этого, и я все еще не нахожу подходящего решения.
В настоящее время это то, что у меня есть:
У меня есть сценарий WeaponUnlock
, который обрабатывает dictionary
оружия, и другой сценарий WeaponSwitcher
, который обращается к вейлам из этого сценария, чтобы проверить, разблокирован он или нет.
public class WeaponUnlockSystem : MonoBehaviour
{
private Dictionary<string, bool> weaponUnlockState;
void Start()
{
// Seeding with some data for example purposes
weaponUnlockState = new Dictionary<string, bool>();
weaponUnlockState.Add("Shotgun", true);
weaponUnlockState.Add("Rifle", true);
weaponUnlockState.Add("FireballGun", false);
weaponUnlockState.Add("LaserGun", false);
weaponUnlockState.Add("FlamethrowerGun", false);
weaponUnlockState.Add("SuperGun", false);
}
public bool IsWeaponUnlocked(string weapon_)
{
if (weaponUnlockState.ContainsKey(weapon_))
return weaponUnlockState[weapon_]; // this will return either true or false if the weapon is unlocked or not
else
return false;
}
public void UnlockWeapon(string weapon_) //this will be called by the button..
{
if (weaponUnlockState.ContainsKey(weapon_))
weaponUnlockState[weapon_] = true;
}
}
WeaponSwitcher
получает имя оружия от вложенных детей при каждом нажатии кнопки nextWeapon
:
weaponName = this.gameObject.transform.GetChild(weaponIdx).name.ToString(); //get the name of the child at current index
if (weaponUnlock.IsWeaponUnlocked(weaponName)) //ask weaponUnlockSystem if this name weapon is unlocked or not, only enable the transform if true is returned
selectedWeapon = weaponIdx;
Это ...... работает ..... но я знаю, что это не практично. Поскольку скрипт находится на игровом объекте и при каждом его вызове вызывается Start()
, который сбрасывает все разблокированные значения. Также я должен сделать это постоянным через DontDestroyOnLOad()
через сцены?
Я могу использовать PlayerPrefs
и установить значение для каждого оружия, но это также не идеально, а также чтобы избежать его сброса каждый раз, когда кто-то открывает мою игру, я должен был бы выполнить проверки PlayerPrefs.HasKey()
для каждого оружие. Также не практично.
Должен быть лучший способ сделать это. Забавно, что я не могу найти много помощи в Интернете для этого и не знаю, как все обходят это.
Спасибо