ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - Gizmos:スクリプトからGizmosを描画する

初めに

 敵キャラの移動範囲や Ray などスクリプトから Gizmos に描画したい場合があります。本記事では、スクリプトから GIzmos を描画する方法をまとめます。

前提知識

 Gozmos 自体についての説明は下の記事にまとめていますので、そちらをご覧ください。

fineworks-fine.hatenablog.com

OnDrawGizmos、OnDrawGizmosSelected

 Gizmos を描画するには、OnDrawGizmos 関数または OnDrawGizmosSelected 関数で実行する必要があります。

関数 説明
OnDrawGizmos 常に描画したい Gizmos を描画する場合
OnDrawGizmosSelected オブジェクトが選択されている場合に Gizmos を描画する

Guzmos を描画する関数

DrawCube

 Gizmos.DrawCube 関数は中心とサイズを持つキューブを描画します。

public static void DrawCube (Vector3 center, Vector3 size);


using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        // Draw a semitransparent blue cube at the transforms position
        Gizmos.color = new Color(1, 0, 0, 0.5f);
        Gizmos.DrawCube(transform.position, new Vector3(1, 1, 1));
    }
}
DrawFrustum

 Gizmos.DrawFrustum 関数は角錐を描画します。

//centerは頂点の位置, fovは頂点の角度, maxRangeは離れた平面までの距離, minRangeは近くの平面までの距離, aspectは幅と高さの比
public static void DrawFrustum (Vector3 center, float fov, float maxRange, float minRange, float aspect);


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

public class GizmosTest : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        Gizmos.color = new Color(1, 0, 0, 0.5f);
        Gizmos.DrawFrustum(transform.position, 60, 200, 0f, 1.6f);
    }
}
DrawGUITexture

 Gizmos.DrawGUITexture 関数では、指定した Textureを表示させることができます。

public static void DrawGUITexture (Rect screenRect, Texture texture, Material mat= null);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GizmosTest : MonoBehaviour
{
    public Texture myTexture;

    void OnDrawGizmosSelected()
    {
        // Draw a semitransparent blue cube at the transforms position
        Gizmos.DrawGUITexture(new Rect(10, 10, 20, 20), myTexture);
    }
}
DrawIcon

 Gizmos.DrawIcon 関数はアイコンを描画することができます。アイコンに使用したい画像は Assets/Gizmos フォルダに置いておく必要があります。



//第1引数はアイコンの位置, 第2引数はアイコンに使用する画像の名前, 第3引数はスケーリング可能かどうか
public static void DrawIcon (Vector3 center, string name, bool allowScaling= true);

※第3引数が true の場合、近づくと拡大、遠ざかると縮小されます。false の場合、アイコンのサイズは変わりません。

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

public class GizmosTest : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        //第2引数は画像の名前
        //第3引数はスケーリング可能かどうか
        Gizmos.DrawIcon(transform.position, "Chara_solo1", true);
    }
}
DrawLine

 Gizmos.DrawLine 関数では、第1引数で指定した位置から第2引数で指定した位置に向かって線分を描画します。

public static void DrawLine (Vector3 from, Vector3 to);


using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    public Transform target;

    void OnDrawGizmosSelected()
    {
        if (target != null)
        {
            // Draws a blue line from this transform to the target
            Gizmos.color = Color.blue;
            Gizmos.DrawLine(transform.position, target.position);
        }
    }
}
DrawMesh

 Gizmos.DrawMesh 関数では、メッシュを描画できます。

public static void DrawMesh (Mesh mesh, Vector3 position= Vector3.zero, Quaternion rotation= Quaternion.identity, Vector3 scale= Vector3.one);


※指定したメッシュによって、形が変わります。

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

public class GizmosTest : MonoBehaviour
{
    public Mesh mesh;

    void OnDrawGizmosSelected()
    {
        // Draws a blue line from this transform to the target
        Gizmos.color = Color.blue;
        Gizmos.DrawMesh(mesh, transform.position, Quaternion.identity, Vector3.one);
    }
}
DrawRay

 Gizmos.DrawRay 関数はレイを描画します。引数は下記の2通りあります。

public static void DrawRay (Ray r);

//こちらの場合, from から from + direction に向けてレイを描画する
public static void DrawRay (Vector3 from, Vector3 direction);


using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        // Draws a 5 unit long red line in front of the object
        Gizmos.color = Color.red;
        Vector3 direction = transform.TransformDirection(Vector3.forward) * 5;
        Gizmos.DrawRay(transform.position, direction);
    }
}
DrawSphere

 Gizmos.DrawSphere 関数は球を描画します。引数から球の中心と半径を指定します。

public static void DrawSphere (Vector3 center, float radius);


using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
    void OnDrawGizmosSelected()
    {
        // Draw a yellow sphere at the transform's position
        Gizmos.color = Color.yellow;
        Gizmos.DrawSphere(transform.position, 1);
    }
}
DrawWireCube、DrawWireMesh、DrawWireSphere

 Wire が含まれている関数は、ワイヤーで形を表します。引数は DrawCube、DrawMesh、DrawSphere と同じです。