Tengo un GameObject llamado Player . Adjunto al reproductor hay un componente de script llamado Player (lo mismo) Dentro del script del jugador, tengo un campo llamado _weaponPrefab (tipo GameObject)

En el Inspector, puedo arrastrar y soltar fácilmente cualquier prefabricado de mi carpeta Prefab, dentro de la variable _weaponPrefab.

Todo bien hasta ahora. Lo que quiero archivar es: poder agregar mis Prefabs basados en una Collision2D . Entonces, si mi Jugador colisiona con un Prefab, digamos una Espada, el prefab de esa espada se adjuntará automáticamente y se insertará en el campo _weaponPrefab dentro del script del Jugador.

Debajo de mi script de jugador:

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;
    }
}

Editar: acabo de escribir un comentario sobre dónde no sé cómo proceder.

1
Ernesto Campese 29 may. 2018 a las 05:30

3 respuestas

La mejor respuesta

Hay muchas formas de lograr lo que deseas.

Mi sugerencia puede estar fuera de su zona de confort al principio, pero le proporcionará la mayor flexibilidad y, finalmente, la programación / diseño / mantenimiento de su juego (en mi opinión).

Primero, cree un objeto programable (qué es un objeto programable y ¿Cómo lo uso?)

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.
    }
}

Crear un nuevo elemento (en Unidad, Activos / nuevo elemento)

Luego, cree un script de monocomportamiento que pueda contener el elemento. En su caso, vamos a llamarlo "Recogida".

public class Pickup : MonoBehaviour
{
    public Item item;
}

Finalmente en tu script de jugador, cambia tu TriggerEnter a:

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

}
2
Immorality 29 may. 2018 a las 16:58

Lo que haré es cargar los prefabricados primero en un Dictionary<string, GameObject> de la carpeta de recursos.

Primero lleno el diccionario con todas las prefabricadas de armas en el método Start con la etiqueta del objeto como clave. Luego, en OnTriggerEnter2D verifico si la etiqueta está en el diccionario y luego la instancia desde allí.

Echa un vistazo al código:

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]);
}

NOTA : sus prefabricados deben estar en la carpeta Assets/Resources/Weapons porque utilicé Resources.Load("Weapons/sword", typeof(GameObject));

0
Antoine Thiry 29 may. 2018 a las 06:20

Cuando crea una instancia de un GameObject, debe pasar básicamente 3 parámetros (sin embargo, no todos son obligatorios, comprobar):

  • La prefabricada
  • La posición
  • La rotación

Supongamos que tienes un marcador de posición en la mano o en la parte posterior de tu personaje, para mantener allí el arma una vez que la recoges. Este marcador de posición puede ser un objeto de juego vacío (sin prefabricado adjunto, pero tendrá un componente transform.position)

Ahora supongamos que tiene una lista de armas en la escena con sus prefabricados y con una etiqueta diferente cada uno. Entonces puedes hacer algo como esto:

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 may. 2018 a las 06:00