unity3d 如何创建一个小控件来渲染BoxCollider2D的边界?

ttygqcqt  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(152)

我想在BoxCollider2D上画一个Gizmos,但是Gizmos没有显示在Scene视图中;控制台中没有错误。
编辑:问题已经解决了,我不小心把OnDrawGizmosfunction放在了Updatefunction中,所以它没有出现。
我的当前代码:

void OnDrawGizmos()
{
    Gizmos.color = Color.red;
    Gizmos.DrawWireCube(boxCollider.bounds.center, boxCollider.bounds.size);
}

oyxsuwqo

oyxsuwqo1#

如果不知道确切的场景设置或其余代码是什么样的,很难判断。但有几个原因可能会导致Gizmo不显示:
1.包含OnDrawGizmos()函数的脚本未与BoxCollider2D组件连接到同一个GameObject

  1. Gizmos选项在场景视图中不是enabled。您可以通过转到场景视图的右上角并单击小图标来启用它:

1.默认情况下,Gizmos不会在Game视图中绘制,因此如果您试图在此视图中呈现它们,则需要通过下拉菜单在与Scene视图相似的位置启用它们。
1.您的boxCollider变量没有被赋值给GameObjectBoxCollider2D组件,尽管这会在控制台中抛出错误。
下面的代码片段应该反映了您尝试创建的内容:

[RequireComponent(typeof(BoxCollider2D))]
public class GizmosDemo : MonoBehaviour
{
    // By using the RequireComponent attribute, we'll ensure a BoxCollider2D component exists
    private BoxCollider2D _boxCollider;

    private void Awake()
    {
        _boxCollider = GetComponent<BoxCollider2D>();
    }

    private void OnDrawGizmos()
    {
        // If we're not adding an Application.isPlaying check, the _boxCollider reference will be unassigned until Awake()
        // So either if(!Application.isPlaying) return; or get the component as we do in the following code
        
        var boxCollider = _boxCollider ? _boxCollider : GetComponent<BoxCollider2D>();
        var bounds = boxCollider.bounds;
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(bounds.center, bounds.size);
    }
    
}
um6iljoc

um6iljoc2#

当存在重叠时,Collider似乎具有优先级。90%的大小使Gizmos.DrawWireCube()出现。

测试代码:

using UnityEngine;

public sealed class GizmosTest : MonoBehaviour
{
    [SerializeField] BoxCollider2D boxCollider;

    void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireCube(boxCollider.bounds.center, boxCollider.bounds.size * 0.9f);
    }
}

相关问题