我有一个名为Player的GameObject。
与Player相连的是一个名为Player的脚本组件(相同)
在播放器脚本中,我有一个名为_weaponPrefab的字段(GameObject类型)

在Inspector中,我可以轻松地从_weaponPrefab变量中的Prefab文件夹中拖放任何预制件。

到目前为止一切都很好。我要存档的是:能够基于Collision2D添加我的预制件。因此,如果我的播放器与“预制”(假设是“剑”)发生冲突,则该剑的预制将自动连接并插入到“播放器”脚本内的_weaponPrefab字段中。

在我的播放器脚本下方:

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


编辑:我只是写了一条我不知道该如何进行的评论。

最佳答案

有很多方法可以实现您的期望。

我的建议起初可能不在您的舒适范围内,但它将为您提供最大的灵活性,并最终使您易于编程/设计/维护游戏(我认为)。

首先创建一个可编写脚本的对象(what is a scriptable object and how do i use it?

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中,资产/新项目)

然后创建一个可以保存该项目的monobehaviour脚本。在您的情况下,我们将其命名为“ Pickup”。

public class Pickup : MonoBehaviour
{
    public Item item;
}


最后,在播放器脚本中,将您的TriggerEnter更改为:

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

}

关于c# - Unity Engine-通过碰撞实例化预制件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50575542/

10-11 03:11