В продолжении темы о ключах и замках.
Задача взять ключ и открыть замок. Для одного замка может быть один ключ или несколько.
Через List пока не понял как. Сделал через PlayerPrefs
Три скрипта.
Скрипт на Player.
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class playerStat : MonoBehaviour
{
public List<int> findedKeys;
void Start()
{
List<int> findedKeys;
}
}
Скрипт для Key
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class key : MonoBehaviour
{
[Header("id ключа")]
public int key_id;
private int _lock;
private playerStat player;
void Awake()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<playerStat>();
_lock = PlayerPrefs.GetInt("keys_id_" + key_id);
if(_lock == 1)
{
player.findedKeys.Add(key_id);
gameObject.SetActive(false);
}
}
private void OnTriggerEnter2D(Collider2D collision) // Триггер
{
if(collision.tag == "Player")
{
_lock = 1;
PlayerPrefs.SetInt("keys_id_" + key_id, 1);
PlayerPrefs.Save();
gameObject.SetActive(false);
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class key : MonoBehaviour
{
[Header("id ключа")]
public int key_id;
private int _lock;
private playerStat player;
void Awake()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<playerStat>();
_lock = PlayerPrefs.GetInt("keys_id_" + key_id);
if(_lock == 1)
{
player.findedKeys.Add(key_id);
gameObject.SetActive(false);
}
}
private void OnTriggerEnter2D(Collider2D collision) // Триггер
{
if(collision.tag == "Player")
{
_lock = 1;
PlayerPrefs.SetInt("keys_id_" + key_id, 1);
PlayerPrefs.Save();
gameObject.SetActive(false);
}
}
}
Скрипт для Door
Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class door : MonoBehaviour
{
[Header("Сколько нужно ключей и их id")]
public int[] keys;
[Header("id двери")]
public int id;
private playerStat player;
private int _lock; // Проверка на то, открывалась ли дверь ранее
private int count_finded; // Количество найденных ключей для данной двери
void Awake()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<playerStat>();
_lock = PlayerPrefs.GetInt("doors_id" + id);
if(_lock == 1)
{
Unlock();
}
}
void Unlock()
{
/*
Что будет происходить с дверью после открытия
*/
Debug.Log("is opening");
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "Player")
{
for (int y = 0; y < keys.Length; y++) {
for (int i = 0; i < player.findedKeys.Count; i++)
{
if (player.findedKeys[i] == keys[y])
{
count_finded++;
continue;
}
}
}
if(count_finded == keys.Length)
{
_lock = 1;
PlayerPrefs.SetInt("doors_id" + id, 1);
PlayerPrefs.Save();
Unlock();
}
}
}
}
using System.Collections.Generic;
using UnityEngine;
public class door : MonoBehaviour
{
[Header("Сколько нужно ключей и их id")]
public int[] keys;
[Header("id двери")]
public int id;
private playerStat player;
private int _lock; // Проверка на то, открывалась ли дверь ранее
private int count_finded; // Количество найденных ключей для данной двери
void Awake()
{
player = GameObject.FindGameObjectWithTag("Player").GetComponent<playerStat>();
_lock = PlayerPrefs.GetInt("doors_id" + id);
if(_lock == 1)
{
Unlock();
}
}
void Unlock()
{
/*
Что будет происходить с дверью после открытия
*/
Debug.Log("is opening");
}
private void OnTriggerEnter2D(Collider2D collision)
{
if(collision.tag == "Player")
{
for (int y = 0; y < keys.Length; y++) {
for (int i = 0; i < player.findedKeys.Count; i++)
{
if (player.findedKeys[i] == keys[y])
{
count_finded++;
continue;
}
}
}
if(count_finded == keys.Length)
{
_lock = 1;
PlayerPrefs.SetInt("doors_id" + id, 1);
PlayerPrefs.Save();
Unlock();
}
}
}
}
В итоге.
Ключи берутся. Но дверь сразу не срабатывает. Только если сцену перезапустить, то дверь открывается.
Подскажите, Что и Где я пропустил?