この記事でのバージョン
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); } }
そんなGizmoで矢印かきたいな〜と思ったら、なんと既にその機能を作られた方がいました。
という事で今回は、それを紹介する感じの記事です!
イメージとしては以下のような感じで、矢印以外にも色々な図形をかけるようになります。
GizmoExtensions
今回紹介するのはGizmoExtensionsというものです。
導入はGitHubからダウンロードし、GizmosExtensions.csというファイルをプロジェクトに入れるだけ。
使うのも簡単で、以下のようにGizmosExtensionsのメソッドを実行するだけ。
ただし、GizmosExtensionsを使うにはusing Utilsが必要になります。
//赤い色で0,0,0から上に1の矢印を引く
Gizmos.color = Color.red;
GizmosExtensions.DrawArrow(Vector3.zero, Vector3.up);
ちなみに2Dでも使えますが、矢印は横に引くと見えなくなります。
//赤い色で0,0,0から右と上に1の矢印を引く
Gizmos.color = Color.red;
GizmosExtensions.DrawArrow(Vector3.zero, Vector3.right);
GizmosExtensions.DrawArrow(Vector3.zero, Vector3.up);
なので、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);
これで矢印を引く向きが変わり、2Dでも見えるようになります。
矢印以外にも円柱やカプセルに、
//赤い色で0,0,0から半径1、高さ4の円柱を書く Gizmos.color = Color.red; GizmosExtensions.DrawWireCylinder(Vector3.zero, 1, 4);
//赤い色で0,0,0から半径1、高さ4のカプセルを書く Gizmos.color = Color.red; GizmosExtensions.DrawWireCapsule(Vector3.zero, 1, 4);
円や弧も描画する事ができます。
(箱や球もかけるが、Gizmoでもかけるので省略)
//赤い色で0,0,0から半径1の円を書く Gizmos.color = Color.red; GizmosExtensions.DrawWireCircle(Vector3.zero, 1);
//赤い色で0,0,0から半径1、90度の弧を書く Gizmos.color = Color.red; GizmosExtensions.DrawWireArc(Vector3.zero, 1, 90);
なお、円や弧を書く時に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)
transform.rotationやQuaternion.identityを指定するようにしましょう。
GizmosExtensions.DrawWireCircle(Vector3.zero, 1, rotation:transform.rotation);
GizmosExtensions.DrawWireCircle(Vector3.zero, 1, rotation:Quaternion.identity);