【问题标题】:Spawning gameobjects relative to the position, width and length of another gameobject?相对于另一个游戏对象的位置、宽度和长度产生游戏对象?
【发布时间】:2020-07-14 08:01:36
【问题描述】:

我目前正在使用 C# 在 Unity 中开发游戏,但遇到了一个小问题。
我需要相对于Spawnposition 和另一个游戏对象的长度生成某个gameobjects
现在我认为bounds.size 将是在此实例中使用的最佳函数。
如下所示,我首先在我的启动方法中声明使用它的变量:

public void Start()
{

 GameObject PointBar = (GameObject) Resources.Load("PointBar Horizontal");
 PointBarVectorLength = PointBar.GetComponent<BoxCollider2D>().bounds.size.x;
 PointBarVectorConv = Camera.main.WorldToViewportPoint(new Vector2(PointBarVectorLength, 0f));

}

但是,有问题的 gameobjects 在 start 调用时处于非活动状态,因此我认为在调用时不会为 bounds.size 返回任何值。

有谁知道我如何访问bounds.size 或等效的非活动gameobject 或者我在这里还缺少什么?

【问题讨论】:

  • 你能画出你想要达到的目标吗?为什么要把它转换成视口空间?
  • 因为我的游戏需要在多种屏幕配置下运行。因为是手机游戏所以我把世界空间转换成ViewportSpace

标签: c# unity3d vector game-engine game-development


【解决方案1】:

in the documentation for the Collider.bounds property 所述,bounds “如果碰撞器被禁用或游戏对象处于非活动状态,则边界框将是一个空边界框”。所以你的假设是非常正确的。由于该对象在世界空间中不存在,这是有道理的。

我不确定最适合您的用例的解决方案,但我想到了两个选项。

  1. 通过访问其 transform.localScale 并考虑预期父对象的比例来计算对象的生成尺寸。这可能会变得一团糟,但您也可以编写一个辅助方法以使其更易于管理。
  2. 加载后在屏幕外的某处实例化对象,访问其 Collider.bounds 属性以获取所需信息,然后将其移动到所需位置或存储信息以备后用。

可能有更好的解决方案,但这就是我想到的。

【讨论】:

  • 是的,第二个选项也是我教过的,但我认为还有另一种方法,如 Resources.load 可以在不活动时访问对象属性,我可以使用它。如果没有,我可能会使用第二种方法。第一个看起来创建时间太长了
  • 它可以访问使用 Resources.Load() 加载的对象及其组件的所有属性,但其中许多属性在对象实例化之前不会有有用的值。
【解决方案2】:

我通过使用 GetComponent().bounds.size.x 解决了这个问题; 而不是 BoxCollider。当游戏对象不活动时,可以访问该组件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2020-01-03
    • 1970-01-01
    相关资源
    最近更新 更多