Я действительно борюсь с созданием системы разблокировки оружия/предметов через внутриигровой магазин. Игрок должен иметь возможность выбирать оружие только по индексам, которые были разблокированы или куплены.
Я потратил два дня на лучший способ добиться этого, и я до сих пор не нашел решения.
На данный момент это то, что у меня есть:
У меня есть скрипт WeaponUnlock
, который обрабатывает dictionary
оружия, и еще один скрипт WeaponSwitcher
, который обращается к vales из этого скрипта, чтобы проверить, разблокировано ли оно или нет.
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()
для каждого оружия. Тоже не практично.
Должен быть лучший способ сделать это. Забавно, что я не могу найти много помощи в Интернете для этого и не знаю, как все обходят это.
Спасибо
Start()
, который сбрасывает все разблокированные значения. Также мне придется сделать его постоянным черезDontDestroyOnLoad()
через сцены? - person StuckInPhDNoMore   schedule 27.05.2019