見出し画像

ゲーム開発で絶対役立つ小ネタスクリプト集1

マリンスクールの開発で、今後のゲーム開発に役立ちそうなノウハウはたくさん詰めました。

(採算はDL数からお察し)
3年の素人開発者経験から、unity c#でできることできないことを身をもって理解し、「かゆいところに手が届かない」を解消する為のテクとスクリプトが溜まったので、紹介します。

#if UNITY_EDITOR


デバッグログは動作確認、不具合の洗い出しに役立ちますが、ビルド時に結構な負荷になるそうなので、Unityエディタでしか実行しなくするといいんですって。
#if UNITY_EDITOR
Debug.Log();
#endif
もっと言えばビルド時でも、デバッグモードでは機能するようにするのがいいですが。


SceneStartDo

AwakeやStartのタイミングで実行したいことを、イベントに登録できます。
さらに、その1フレーム後、n秒後に実行させたいイベントも登録できます。
SceneStartDo.cs

using UnityEngine;
using UnityEngine.Events;

public class SceneStartDo : MonoBehaviour
{
    //----------------起動時イベントの実行-----------------------------------

    [Header("開始時になにかしたいこと")]
    public UnityEvent OnAwake;

    private void Awake()
    {
        OnAwake.Invoke();
    }

    public UnityEvent OnStart;
    public UnityEvent OnStart2;
    bool OnceOnStart2=true;
    [Header("開始後 遅延でしたいこと DelayTime0以下は無効")]
    public UnityEvent OnDelayStart;
    public float DelayTime;
    float DelayCounter = 0;
    bool count = true;

    private void Start()
    {
        OnStart.Invoke();
    }

    private void Update()
    {
        if (OnceOnStart2) 
        {
            OnStart2.Invoke();
            OnceOnStart2 = false; 
        }

        if (!count) return;

        DelayCounter += Time.deltaTime;
        if ((DelayTime > 0) && (DelayCounter > DelayTime))
        {
            OnDelayStart.Invoke();
            DelayCounter = 0;
            count = false;
        }
    }


なぜこれが役立つかというと、メニューUIとか非表示状態にしてスタートさせたいオブジェクトを、編集するため表示して、また元通りにしまうのは実に面倒です。これを使えば、実行時に自動で非表示にできるって寸法よ。
Delay Startは、シーン開始時に開幕デモをして、n秒後プレイヤー操作可能にする、ということをするのに役立ちます。

DeligatePlus


UnityEventを配列にしただけです。


    [SerializeField, Header("流用したいイベント控え"), Tooltip("流用したいイベント控え")]
    public UnityEvent[] DeligatePluss;


    public void DeligatePlus(int a)
    {
        a = Mathf.Clamp(a, 0, DeligatePluss.Length - 1);

        DeligatePluss[a].Invoke();
    }

独立したスクリプトにするまでもないチャチなコードです。
たとえばファストトラベルで複数のワープ先を指定するUIなど、
メニューUIをひっこめる→キャラ操作一時停止
→キャラを指定した座標にワープ(この部分だけ違う)
→画面暗転演出→ワープSEを鳴らす→キャラ操作一時停止解除
こういう感じにイベントに登録して実行するメソッドがほとんど同じで長くて、途中の一部だけ違ってて、それが複数ならぶ…なんて状況で、
共通部分をDeligatePlussに登録しといてDeligatePlus(int a)で実行すれば、長くなりがちなUnityEventもスッキリしてミスが減るという寸法です。
どの要素数のDeligatePlus(int a)がどの役割かも併せて表記できたらさらにいいですが。

空オブジェクト可視化

空オブジェクトにわかりやすくアイコンやギズモをつけます。
BillboardGizmo.cs

using UnityEngine;

public class BillboardGizmo : MonoBehaviour 
{
	public string iconName = "icon.png";
	float isize=0.2f 
	void OnDrawGizmos()
	{
		Gizmos.DrawIcon(gameObject.transform.position, iconName, true);
		transform.localScale = Vector3.one*isize;
	}
}

アイコン画像をAssets/Gizmosフォルダにいれておき、ファイル名をiconNameにセットすることで使えます。

こちらはxyzギズモと箱や球を表示します。軸や箱や球の色を変えて役割を識別できたり、その大きさを変えて 影響範囲などを可視化したりできます。
SimpleGizmoMarker.cs

using UnityEngine;

public class SimpleGizmoMarker : MonoBehaviour
{
    [Header("箱を表示する falseなら球")]
    public bool DrawCube;
    [Header("箱または球のサイズ")]
    public float Boxsize = 0.2f;
    [Header("箱の色")]
    public Color BoxColor = new Color(1, 0, 1, 1f);

    [Header("箱または球を垂直ラインの先端に表示する")]
    public bool Topvertical;

    [Header("垂直ラインの色")]
    public Color VerticalColor = new Color(1, 0, 0, 1f);
    public Color ForwardColor = new Color(0, 1, 0, 1f);
    public Color SphereColor = new Color(1, 1, 1, 1f);
    [Header("垂直ラインの長さ")]
    public float LineLength = 1.5f;

    [Header("可視化")]
    public bool visible = true;

    void OnDrawGizmos()
    {
        if (!visible) return;

        Vector3 marker = transform.position;
        Vector3 markerF = marker + transform.forward * LineLength;
        Vector3 markerU = marker;
        markerU.y += LineLength * 1.2f;
        Gizmos.color = ForwardColor;
        Gizmos.DrawLine(marker, markerF);
        Gizmos.color = VerticalColor;
        Gizmos.DrawLine(marker, markerU);

        if (Topvertical) { marker.y += LineLength; }

        if (DrawCube)
        {
            Gizmos.color = BoxColor;
            Gizmos.DrawCube(marker, Vector3.one * Boxsize);
        }
        else
        {
            Gizmos.color = SphereColor;
            Gizmos.DrawSphere(marker, Boxsize);
        }
}

マップに何百と置くと重くなるので、bool visible(可視化)をfalseにするか、OnDrawGizmos()をOnDrawGizmosSelected(選択時のみ表示)に改変するのもいいでしょう。

どれもチープなもので有料アセットで販売するには憚れるけど、
Unity基礎機能でついてくれよぐらいの実用性があるでしょう。

なお、ここに記したスクリプトは実際のゲームに使ったものから未使用の変数とか試行錯誤の跡とかを削って若干改変してテストしてないので、完全な動作保証はしません。

この記事が気に入ったらサポートをしてみませんか?