勇哥注:
上料是指自动供料机构,例如震动盘,感应到就供一个料。
其实就是通过触发器复制一个对象实例。
(图1)
代码:
public class ProductFeeder : MonoBehaviour { public GameObject product; bool available=true; private void Start() { Produce(); } private void OnTriggerExit(Collider other) { Produce(); } void Produce() { if (available) { var temp = Instantiate(product, transform); } } }
Instantiate 是Unity中的一个内置方法,用于创建(或称为“实例化”)一个新的游戏对象。
这个方法可以复制任何已经存在于场景中的游戏对象,或者复制任何通过脚本动态创建的游戏对象。
product 参数:
product 是 Instantiate 方法的第一个参数,它代表了一个游戏对象(GameObject)或者一个预制件(Prefab)的引用。
如果 product 是一个预制件,那么 Instantiate 方法会创建一个该预制件的新实例。
如果 product 是一个已经存在于场景中的游戏对象,那么 Instantiate 方法会复制这个对象。
transform 参数:
transform 是 Instantiate 方法的第二个参数,它代表了一个Transform类型的值,用于指定新实例化的游戏对象应该被放置在世界空间中的哪个位置。
这里为啥transform没有定义却可以直接使用呢?
在Unity的C#脚本中,transform 通常是一个预定义的属性,它属于每个GameObject类的一个实例。
这意味着,当你在Unity的脚本中编写代码时,如果你正在编写的是一个继承自MonoBehaviour的类的成员方法,
并且这个方法属于一个附加到某个游戏对象上的脚本,那么你可以直接访问transform属性,而无需事先定义它。
代码是很简单,但是实际操作的时候,发现一个问题。
就是复制出来的对象为啥不是原对象的大小?比例也不对呢?
如图1所示,复制出来的罐子比例是不对的。
正常尺寸应该是下面这样的:
其实,主要是那个Cube的Transform的缩放大小要一致,下图中都是0.1,这样罐子就等比例了。
但是其大小跟随Cube变化。
当触发器框碰到了start()函数复制的那个罐子后,就开闸放水般疯狂复制了。
这个复制的速度当然就是等于你帧速度。

