# Unity3D -使用最后一个对象的面作为目标并删除检测到的最后一个面将一个对象附加到另一个对象

5kgi1eie  于 2022-12-13  发布在  其他
关注(0)|答案(2)|浏览(169)

假设我有三个简单的盒子状对象,我想通过按下键盘上的特定键(比如W键用于对象2,S键用于对象3),以任意顺序向场景中已经存在的第一个对象添加另一个对象,然后再添加另一个对象,来制作不同的组合。
例如:

之后,我想删除最后一个目前的对象,每次我想按Q键。
例如,我按W,W,S,W,S(对象2,对象2,对象3,对象2,对象3)。
之后,我按下Q三次(获得合成Obj 2,Obj 2,因为我用Q破坏了最后三个)。
然后我按W一次(获得Obj 2,Obj 2,Obj 2)。
模块化部分由放入空游戏对象(其在对象1、2和3内)中的脚本制成。

public class Placement : MonoBehaviour
{
    public GameObject shape1, shape2, shape3;
    public Counter count;

    void Start()
    {
        count = FindObjectOfType<Counter>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            count.Array[count.i] = Instantiate(shape3, transform.position, transform.rotation);
            this.enabled = false;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            count.Array[count.i] = Instantiate(shape2, transform.position, transform.rotation);
            this.enabled = false;
        }
        if (Input.GetKeyDown(KeyCode.Alpha6))
        {
                
        Destroy(count.Array[count.i]);
        count.i = count.i - 1;          
    }
}

然后我使用一个计数器和一个GameObject数组来“保存”场景中的每个克隆,在另一个通用脚本中始终存在于场景中。

public class Counter : MonoBehaviour
{
    public int i = 0;
    public GameObject[] Array = new GameObject[50];

    public void Update()
    {
        if (Input.GetKeyDown(KeyCode.W))
        {
            i = i + 1;
        }
        if (Input.GetKeyDown(KeyCode.S))
        {
            i = i + 1;
        }
    }
}

问题是:
1.第一个脚本每次都是“重新加载”的,因为它在我放入场景中的每个示例化对象中,所以我必须使用一个外部脚本来保存我需要的每个计数器和/或GameObject引用;
1.如果我移除这个。enabled = false;从每个示例化过程中,脚本部分工作,但它创建了太多的相同对象的克隆(因为它使用场景中的每个空游戏对象作为放置克隆的参考,而不仅仅是最后一个存在);
1.通过创建太多的克隆(即使我按下W/S一次),如果我试图销毁最后一个,它会销毁许多其他的,如果我试图把其他在销毁过程后,它会克隆的对象在每个位置可用,而不是最后一个。
我开始在一个愚蠢的过程中失去理智...:“)

aiazj4mn

aiazj4mn1#

1.使用一个空的游戏对象作为ObjectSpawnManager来管理你的对象繁殖/毁灭行为,把第一个脚本放到这个对象上,这样你就不需要把同一个脚本放到多个示例上。
1.删除Counter脚本中的Update部分,添加UpdateCounter公共方法,并在按下相应键时从ObjectSpawnManager脚本中调用它。

ao218c7q

ao218c7q2#

既然你已经提出了一些问题,但没有具体的问题,我将向你提出一个可行的方法,并落实你的要求。如果你想澄清一个具体的问题,请随时提出。
正如你自己所说的,用一个脚本来管理放置对象的整个过程更有意义。将这个脚本,我们称之为SpawnManagerScript,附加到场景中的一个空的GameObject上,例如SpawnManager
如果你不确定某个时间点上有多少对象,我也建议你使用List而不是数组。如果你确实想把对象的数量限制在50(看你的代码),数组完全可以。
假设你已经能够在产卵时找出对象的正确位置,我就不详细介绍了。
如果我没理解错的话,现在要做的是:
1.繁殖GameObject:区分用户输入(例如SW)。对于每种类型的对象,您可以在SpawnManagerScript类中拥有一个public字段,该字段引用场景中的预置或模板GameObject。您可以使用模板对象根据用户输入进行克隆。将此克隆添加到List或对象数组中,并将其正确定位。
1.删除GameObject:同样,在脚本中检测要删除的输入键。从相应的容器中获取List中的最后一个元素或数组中最后添加的元素。销毁它或将其设置为非活动状态。从容器中删除条目。

相关问题