У меня есть GameObject под названием Player . Прикрепленный к плееру компонент скрипта называется Player (то же самое). Внутри скрипта игрока у меня есть поле с именем _weaponPrefab (тип GameObject)

В Инспекторе я могу легко перетаскивать любые префабы из папки Prefab внутри переменной _weaponPrefab.

Пока все хорошо. То, что я хочу заархивировать: это возможность добавлять свои префабы на основе Collision2D . Поэтому, если мой игрок сталкивается с префабом, скажем, с мечом, префаб этого меча будет автоматически прикреплен и вставлен в поле _weaponPrefab внутри скрипта Player.

Ниже мой скрипт игрока:

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

public class Player : MonoBehaviour
{
    [SerializeField] private float _speed = 5.0f;
    [SerializeField] private float _fireRate = 0.2f;
                     private bool _canFire = true;


    [SerializeField] private GameObject _weaponPrefab; <- to populate runtime


    // Use this for initialization
    void Start ()
    {
        transform.position = Vector3.zero;
    }

    // Update is called once per frame
    void Update ()
    {
        if (Input.GetKeyDown(KeyCode.Space) && _canFire)
            StartCoroutine(Shoot());
    }


    void OnTriggerEnter2D(Collider2D other)
    {
        //here i don't know how to continue.

    }

    public IEnumerator Shoot()
    {
        _canFire = false;
        Instantiate(_weaponPrefab, transform.position + new Vector3(0, 1, 0), Quaternion.identity);
        yield return new WaitForSeconds(_fireRate);
        _canFire = true;
    }
}

Изменить: я просто написал комментарий, где я не знаю, как действовать.

1
Ernesto Campese 29 Май 2018 в 05:30

3 ответа

Лучший ответ

Есть много способов достичь желаемого.

Поначалу мое предложение может быть за пределами вашей зоны комфорта, но оно предоставит вам большую гибкость и в конечном итоге упростит программирование / проектирование / сопровождение вашей игры (на мой взгляд).

Сначала создайте объект с возможностью сценария (что такое объект с возможностью сценария и как им пользоваться?)

using UnityEngine;
using System.Collections;
using UnityEditor;

public class Item
{
    [CreateAssetMenu(menuName = "new Item")]
    public static void CreateMyAsset()
    {
        public GameObject prefab;
        // you can add other variables here aswell, like cost, durability etc.
    }
}

Создать новый предмет (в Unity, Активы / новый предмет)

Затем создайте монобихологический сценарий, который может содержать элемент. В вашем случае давайте назовем это «Пикап».

public class Pickup : MonoBehaviour
{
    public Item item;
}

Наконец, в вашем скрипте игрока измените ваш onTriggerEnter на:

void OnTriggerEnter2D(Collider2D other)
{
    if(other.GetComponentInChildren<Pickup>())
    {
        var item = other.GetComponentInChildren<Pickup>().item;
        _weaponPrefab = item.prefab;
    }

}
2
Immorality 29 Май 2018 в 16:58

Когда вы создаете экземпляр GameObject, вам нужно передать в основном 3 параметра (однако не все из них являются обязательными, проверка ) :

  • Сборный дом
  • Положение
  • Вращение

Давайте предположим, что у вас есть заполнитель в руке или на спине вашего персонажа, чтобы хранить там оружие, когда-то собранное. Этот заполнитель может быть пустым игровым объектом (без префаба, но будет иметь компонент transform.position)

Теперь давайте предположим, что у вас есть список оружия на сцене с его префабом и разными тегами. Тогда вы можете сделать что-то вроде этого:

GameObject weapon;
GameObject placeholder;

public Transform sword;
public Transform bow;
...


void OnTriggerEnter2D(Collider2D other)
{
    //You can use a switch/case instead
    if(other.gameObject.tag == "sword"){
        Instantiate(sword, placeholder.transform.position, Quaternion.identity);
    }else if(other.gameObject.tag == "bow"){
        Instantiate(bow, placeholder.transform.position, Quaternion.identity);
    }...

}
2
Ignacio Alorre 29 Май 2018 в 06:00

Что я сделаю, так это сначала загрузлю префабы в Dictionary<string, GameObject> из папки ресурсов.

Сначала я заполняю словарь всеми префабами оружия в методе Start с тегом объекта в качестве ключа. Затем в OnTriggerEnter2D я проверяю, есть ли тег в словаре, и создаю его оттуда.

Взгляните на код:

private Dictionary<string, GameObject> prefabs;

// Use this for initialization
void Start () {
    var sword = (GameObject) Resources.Load("Weapons/sword", typeof(GameObject));
    prefabs.Add("sword", sword);
    // Add other prefabs
};

void OnTriggerEnter2D(Collider2D other)
{
    if (prefabs.ContainsKey(other.tag))
        Instantiate(prefabs[other.tag]);
}

ПРИМЕЧАНИЕ : ваши префабы должны находиться в папке Assets/Resources/Weapons, потому что я использовал Resources.Load("Weapons/sword", typeof(GameObject));

0
Antoine Thiry 29 Май 2018 в 06:20