(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

ギズモで矢印、円柱、カプセル、円、弧を描画出来るようにするGizmoExtensions 【Unity】【Gizmos】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.4.4f1


はじめに

UnityではGizmosを使ってSceneView上に線や図形などを描画が出来ます。

(GameViewには表示されないので、エディタ上での確認用)

public class NewBehaviourScript : MonoBehaviour{
   
  private void OnDrawGizmos() {
    //赤い色で0,0,0から上に1の線を引く
    Gizmos.color = Color.red;
    Gizmos.DrawLine(Vector3.zero, Vector3.up);
  }

}
f:id:kan_kikuchi:20190807075041j:plain


そんなGizmoで矢印かきたいな〜と思ったら、なんと既にその機能を作られた方がいました。



という事で今回は、それを紹介する感じの記事です!

イメージとしては以下のような感じで、矢印以外にも色々な図形をかけるようになります。

f:id:kan_kikuchi:20190807083516g:plain



GizmoExtensions

今回紹介するのはGizmoExtensionsというものです。



導入はGitHubからダウンロードし、GizmosExtensions.csというファイルをプロジェクトに入れるだけ。

f:id:kan_kikuchi:20190807083250j:plain
f:id:kan_kikuchi:20190807083302j:plain


使うのも簡単で、以下のようにGizmosExtensionsのメソッドを実行するだけ。

ただし、GizmosExtensionsを使うにはusing Utilsが必要になります。

//赤い色で0,0,0から上に1の矢印を引く
Gizmos.color = Color.red;
GizmosExtensions.DrawArrow(Vector3.zero, Vector3.up);
f:id:kan_kikuchi:20190807083456j:plain


ちなみに2Dでも使えますが、矢印は横に引くと見えなくなります。

//赤い色で0,0,0から右と上に1の矢印を引く
Gizmos.color = Color.red;
GizmosExtensions.DrawArrow(Vector3.zero, Vector3.right);
GizmosExtensions.DrawArrow(Vector3.zero, Vector3.up);
f:id:kan_kikuchi:20190808111534j:plain
f:id:kan_kikuchi:20190808111552j:plain


なので、2Dで使いたい場合はコードをちょっと修正する必要があります。

具体的にはDrawArrowというメソッドのQuaternion.LookRotationを使っている所で、

第二引数にVector3.forwardを追加します。

var right = Quaternion.LookRotation(direction, Vector3.forward) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * new Vector3(0, 0, 1);
var left = Quaternion.LookRotation(direction, Vector3.forward) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * new Vector3(0, 0, 1);
f:id:kan_kikuchi:20190808111922j:plain


これで矢印を引く向きが変わり、2Dでも見えるようになります。

f:id:kan_kikuchi:20190808111733j:plain


矢印以外にも円柱カプセルに、

//赤い色で0,0,0から半径1、高さ4の円柱を書く
Gizmos.color = Color.red;
GizmosExtensions.DrawWireCylinder(Vector3.zero, 1, 4);
f:id:kan_kikuchi:20190808110038j:plain
//赤い色で0,0,0から半径1、高さ4のカプセルを書く
Gizmos.color = Color.red;
GizmosExtensions.DrawWireCapsule(Vector3.zero, 1, 4);
f:id:kan_kikuchi:20190808110149j:plain


も描画する事ができます。

(箱や球もかけるが、Gizmoでもかけるので省略)

//赤い色で0,0,0から半径1の円を書く
Gizmos.color = Color.red;
GizmosExtensions.DrawWireCircle(Vector3.zero, 1);
f:id:kan_kikuchi:20190808110437j:plain
//赤い色で0,0,0から半径1、90度の弧を書く
Gizmos.color = Color.red;
GizmosExtensions.DrawWireArc(Vector3.zero, 1, 90);
f:id:kan_kikuchi:20190808110524j:plain


なお、円や弧を書く時にrotationを指定しないと以下のようにエラーが出るので、

Quaternion To Matrix conversion failed because input Quaternion is invalid {0.000000, 0.000000, 0.000000, 0.000000} l=0.000000
UnityEngine.Matrix4x4:TRS(Vector3, Quaternion, Vector3)
Utils.GizmosExtensions:DrawWireArc(Vector3, Single, Single, Int32, Quaternion) (at Assets/GizmosExtensions.cs:65)
NewBehaviourScript:OnDrawGizmos() (at Assets/NewBehaviourScript.cs:31)
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

f:id:kan_kikuchi:20190808110608j:plain


transform.rotationやQuaternion.identityを指定するようにしましょう。

GizmosExtensions.DrawWireCircle(Vector3.zero, 1, rotation:transform.rotation);
GizmosExtensions.DrawWireCircle(Vector3.zero, 1, rotation:Quaternion.identity);