猿问

Unity Engine - 通过碰撞实例化预制件

我有一个名为Player的 GameObject 。附加到 Player 有一个名为Player的脚本组件(相同) 在 Player 的脚本中,我有一个名为_weaponPrefab的字段(GameObject类型)


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


到目前为止一切都很好。我想要存档的是:能够基于Collision2D添加我的预制件。因此,如果我的 Player 与 Prefab 发生碰撞,比如说是 Sword,则该剑的 prefab 将自动附加并插入到 Player 脚本中的 _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;

    }

}


千巷猫影
浏览 147回答 3
3回答

小唯快跑啊

有很多方法可以实现您的愿望。我的建议一开始可能会超出您的舒适区,但它会为您提供最大的灵活性,并最终使您的游戏编程/设计/维护变得容易(在我看来)。首先制作一个可编写脚本的对象(什么是可编写脚本的对象以及如何使用它?)using UnityEngine;using System.Collections;using UnityEditor;public class Item{&nbsp; &nbsp; [CreateAssetMenu(menuName = "new Item")]&nbsp; &nbsp; public static void CreateMyAsset()&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; public GameObject prefab;&nbsp; &nbsp; &nbsp; &nbsp; // you can add other variables here aswell, like cost, durability etc.&nbsp; &nbsp; }}创建一个新项目(在 Unity 中,Assets/new Item)然后创建一个可以容纳该项目的 monobehaviour 脚本。在您的情况下,让我们将其命名为“皮卡”。public class Pickup : MonoBehaviour{&nbsp; &nbsp; public Item item;}最后在您的播放器脚本中,将您的 TriggerEnter 更改为:void OnTriggerEnter2D(Collider2D other){&nbsp; &nbsp; if(other.GetComponentInChildren<Pickup>())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var item = other.GetComponentInChildren<Pickup>().item;&nbsp; &nbsp; &nbsp; &nbsp; _weaponPrefab = item.prefab;&nbsp; &nbsp; }}

宝慕林4294392

当您实例化一个 GameObject 时,您基本上需要传递 3 个参数(但并非所有参数都是必需的,请检查):预制件职位轮换假设您的手上或角色背后有一个占位符,用于在收集武器后将其保存在那里。这个占位符可以是一个空的游戏对象(没有附加预制件,但会有一个 transform.position 组件)现在让我们假设您在场景中有一个武器列表,其中包含它们的预制件和不同的标签。然后你可以做这样的事情:GameObject weapon;GameObject placeholder;public Transform sword;public Transform bow;...void OnTriggerEnter2D(Collider2D other){&nbsp; &nbsp; //You can use a switch/case instead&nbsp; &nbsp; if(other.gameObject.tag == "sword"){&nbsp; &nbsp; &nbsp; &nbsp; Instantiate(sword, placeholder.transform.position, Quaternion.identity);&nbsp; &nbsp; }else if(other.gameObject.tag == "bow"){&nbsp; &nbsp; &nbsp; &nbsp; Instantiate(bow, placeholder.transform.position, Quaternion.identity);&nbsp; &nbsp; }...}
随时随地看视频慕课网APP
我要回答