我有一个名为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/