为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
千巷猫影 2021-07-06 10:01:38
我有一个名为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;    }}
查看完整描述

3 回答

?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

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


我的建议一开始可能会超出您的舒适区,但它会为您提供最大的灵活性,并最终使您的游戏编程/设计/维护变得容易(在我看来)。


首先制作一个可编写脚本的对象(什么是可编写脚本的对象以及如何使用它?)


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 中,Assets/new Item)


然后创建一个可以容纳该项目的 monobehaviour 脚本。在您的情况下,让我们将其命名为“皮卡”。


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;

    }


}


查看完整回答
反对 回复 2021-07-10
?
宝慕林4294392

TA贡献2021条经验 获得超8个赞

当您实例化一个 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);

    }...


}


查看完整回答
反对 回复 2021-07-10
  • 3 回答
  • 0 关注
  • 146 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信