Ключи, двери, сундуки. Скрипт.

Программирование на Юнити.

Ключи, двери, сундуки. Скрипт.

Сообщение Nekokoneko 30 окт 2019, 11:16

Доброго времени суток.

В продолжении темы о ключах и замках.
Задача взять ключ и открыть замок. Для одного замка может быть один ключ или несколько.

Через 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);
        }
    }
}
 


Скрипт для 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();
            }
        }
    }
}

 

В итоге.
Ключи берутся. Но дверь сразу не срабатывает. Только если сцену перезапустить, то дверь открывается.

Подскажите, Что и Где я пропустил?
Nekokoneko
UNец
 
Сообщения: 13
Зарегистрирован: 29 июн 2018, 17:18

Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9