[Unity3D] 커스텀 기즈모

oy Hong·2024년 5월 5일

Unity

목록 보기
2/3

커스텀 기즈모


커스텀 기즈모를 활용하는 방법을 간단히 알아보자.

스크립트

웨이포인트 스크립트 활용하여 기즈모를 그리는 코드를 추가해보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class WaypointPath : MonoBehaviour
{
    public Transform GetWaypoint(int waypointIndex)
    {
        return transform.GetChild(waypointIndex);
    }

    public int GetNextWaypointIndex(int currentWaypointIndex)
    {
        int nextWaypointIndex = currentWaypointIndex + 1;
        if(nextWaypointIndex == transform.childCount)
        {
            nextWaypointIndex = 0;
        }

        return nextWaypointIndex;
    }

    private void OnDrawGizmos()
    {
        for (int waypoinIndex = 0; waypoinIndex < transform.childCount; waypoinIndex++)
        {
            // 웨이포인트 지점에 원 그리기
            var waypoint = GetWaypoint(waypoinIndex);

            Gizmos.color = Color.cyan;
            Gizmos.DrawSphere(waypoint.position, 0.2f);

            // 다음 웨이포인트까지 선그리기
            int nextWaypointIndex = GetNextWaypointIndex(waypoinIndex);
            var nextWaypoint = GetWaypoint(nextWaypointIndex);

            Gizmos.color = Color.yellow;
            Gizmos.DrawLine(waypoint.position, nextWaypoint.position);
        }
    }
}

씬 뷰

개선

#1 선택한 경우만

웨이포인트 오브젝트의 부모, 자식 오브젝트를 클릭했을 때만 기즈모가 나오도록 수정해보자.

// 네임스페이스 추가
using System.Linq;
using UnityEditor;

// 수정
private void OnDrawGizmos()
{
    if (IsWaypointSelected())
    {
        for (int waypoinIndex = 0; waypoinIndex < transform.childCount; waypoinIndex++)
        {
            // 웨이포인트 지점에 원 그리기
            var waypoint = GetWaypoint(waypoinIndex);

            Gizmos.color = Color.cyan;
            Gizmos.DrawSphere(waypoint.position, 0.2f);

            // 다음 웨이포인트까지 선그리기
            int nextWaypointIndex = GetNextWaypointIndex(waypoinIndex);
            var nextWaypoint = GetWaypoint(nextWaypointIndex);

            Gizmos.color = Color.yellow;
            Gizmos.DrawLine(waypoint.position, nextWaypoint.position);
        }
    }
}

private bool IsWaypointSelected()
{
    // 현재 오브젝트를 선택했는지
    if (Selection.transforms.Contains(transform))
    {
        return true;
    }

    // 현재 오브젝트의 자식 오브젝트가 선택되었는지
    foreach (Transform child in transform)
    {
        if (Selection.transforms.Contains(child))
        {
            return true;
        }
    }

    return false;
}

#2 관련 오브젝트가 선택된 경우

실제로 움직이는 플랫폼 오브젝트를 선택했을 때도 웨이포인트 기즈모가 출력되도록 수정해보자.

WaypointPath 스크립트 수정

private void OnDrawGizmos()
{
    if (IsWaypointSelected())
    {
        DrawWaypointGizmo();
    }
}

public void DrawWaypointGizmo()
{
    for (int waypoinIndex = 0; waypoinIndex < transform.childCount; waypoinIndex++)
    {
        // 웨이포인트 지점에 원 그리기
        var waypoint = GetWaypoint(waypoinIndex);

        Gizmos.color = Color.cyan;
        Gizmos.DrawSphere(waypoint.position, 0.2f);

        // 다음 웨이포인트까지 선그리기
        int nextWaypointIndex = GetNextWaypointIndex(waypoinIndex);
        var nextWaypoint = GetWaypoint(nextWaypointIndex);

        Gizmos.color = Color.yellow;
        Gizmos.DrawLine(waypoint.position, nextWaypoint.position);
    }
}

실제 오브젝트를 조작하는 스크립트 수정

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MovingPlatform : MonoBehaviour
{
    public WaypointPath waypointPath;

    private void OnDrawGizmosSelected()
    {
        waypointPath.DrawWaypointGizmo();
    }
}

0개의 댓글