夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Hololens用のオリジナルUIを作成する。 ~スイッチレバー その⑥ 変数名をわかりやすくする。

MRTKを基にHoloLensで使用できるオリジナルのUIを作成します。

過去にSFチックのUIを作成していました。 今回はシリーズ続編としての第三回です。

〇第一弾

redhologerbera.hatenablog.com

〇第二弾

redhologerbera.hatenablog.com

本シリーズで作成したものは以下でMITライセンスで公開しています。(自由に使ってください)

github.com

今回第三弾はレバー(stick)型のUIを作っています。今までは動かすためにざっと書いてきたコードですがブログやgitHub等で紹介する際にとりあえず付けた変数名がわかりずらいのでよい機会なので変数名をわかりやすく変更します。

〇プログラミングの命名規則

C#の開発元のMicrosoftのドキュメントによると

フィールド名には Pascal 形式を使用してください

フィールドの名前には、名詞や名詞句を使用してください。

フィールド名にはプリフィックスを使用しないでください。 たとえば、静的フィールドと非静的フィールドを区別するために、g や s を使用しないでください。

とあります。

docs.microsoft.com

docs.microsoft.com

Pascal形式は各単語の頭文字を大文字で記述します。

基本的には単語の接続には"-"や"_"は使わず例えばString YourNameやint NextNumberというように記述します。

またパラメーター名には Camel 形式を使用します。

Camel形式は以下のサイトがとても分かりやすく参考になりました。

https://wa3.i-3-i.info/word1179.html

また、すべてにおいてほかの人が読んでいてわかりやすいように命名する必要があります。これに倣ってコードを修正していきます。

 vector3 dpos;
    public void Update()
    {
        if (_ActionEnebled)
        {
        dpos = this.gameObject.transform.localPosition;

        float yaxisparm = System.Math.Abs(dpos.y);
        float xaxisparm = System.Math.Abs(dpos.x);

        bool result = yaxisparm > xaxisparm;
        bool resulty = dpos.y > 0;
        bool resultx = dpos.x > 0;
        bool resultabsy = yaxisparm > minRange;
        bool resultabsx = xaxisparm > minRange;

            if (!resultabsx && !resultabsy)
            {
                //  UpdateStatus(false, false, false, false);
            }

            if (result && resulty && resultabsy)
            {
                if (_OnUpdateupperAxisEvent)
                {
                    reslutUpperAxisEvent();
                }
            }

            if (result && !resulty && resultabsy)
            {
                if (_OnUpdatedownAxisEvent)
                {
                    reslutDownAxisEvent();
                }
            }

            if (!result && resultx && resultabsx)
            {
                if (_OnUpdaterightAxisEvent)
                {
                    reslutRightAxisEvent();
                }
            }

            if (!result && !resultx && resultabsx)
            {
                if (_OnUpdateleftAxisEvent)
                {
                    resultLeftAxisEvent();
                }
            }
        }
    }
    void reslutRightAxisEvent()
    {
     ...
    }

    void resultLeftAxisEvent()
    {
     ...
    }

    void reslutUpperAxisEvent()
    {
     ...
    }

    void reslutDownAxisEvent()
    {
     ...
    }
    public void leverHoldStat()
    {
     ...
    }
   public void leverHoldEnd()
    {
        Debug.Log("leverActionEnd");
        _ActionEnebled = false;
        Debug.Log("PointerReset");
        this.gameObject.transform.localPosition = new Vector3(0, 0, 0);
        _OnUpdateupperAxisEvent = true;
        _OnUpdatedownAxisEvent = true;
        _OnUpdaterightAxisEvent = true;
        _OnUpdateleftAxisEvent = true;
    }

●bool型

bool型はis○○命名することが多いようです。また、その状態になっているかどうかという場合has○○、実行可能な状態かどうかという場合can○○を使用するようです。

_ActionEnebled=>isActionEnavled

result=>isYaxisInput

resulty=>isYaxisPlus

resultx=>isXaxisPlus

resultabsy=>isYaxisDetection

resultabsx=>isXaxisDetection

●float型

yaxisparm=>YAxisValue xaxisparam=>XAxisValue

●vector3

dpos=>positionalShift


変数名をわかりやすくしたものが次です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using Microsoft.MixedReality.Toolkit.UI;


public class Switchlever : MonoBehaviour
{
    //Event
    public UnityEvent OnUpdateRightAxisEvent;
    public UnityEvent OnUpdateLeftAxisEvent;
    public UnityEvent OnUpdateUpAxisEvent;
    public UnityEvent OnUpdateDownAxisEvent;

    //min detect area (Radias)
    public float minRange;
    
    bool isActionEnebled = false;
    
    bool isUpdateUpperAxisEventEnabled = true;
    bool isUpdateDownAxisEventEnabled = true;
    bool isUpdateRightAxisEventEnabled = true;
    bool isUpdateLeftAxisEventEnabled = true;


    Vector3 PositionalShift;
    
    private void Reset()
    {
        Interactable inte = this.gameObject.GetComponent<Interactable>();
        InteractableReceiver ire = this.gameObject.GetComponent<InteractableReceiver>();
        ire.Interactable = inte;       
    }

    public void Update()
    {
        if (isActionEnebled)
        {
            PositionalShift = this.gameObject.transform.localPosition;

            //Absolute value of the target coordinates (local)
            float YAxisValue = System.Math.Abs(positionalShift.y);
            float XAxisValue = System.Math.Abs(positionalShift.x);

            //Y-axis input or not
            bool isYaxisInput = YAxisValue > XAxisValue;
            
            bool isYaxisPlus = positionalShift.y > 0;
            bool isXaxisPlus = positionalShift.x > 0;
            bool isYaxisDetection = YAxisValue > minRange;
            bool isXaxisDetection = XAxisValue > minRange;

           // Debug.Log(resultabsx);

            if (!isXaxisDetection && !isYaxisDetection)
            {
                //  UpdateStatus(false, false, false, false);
            }

            if (isYaxisInput && isYaxisPlus && isYaxisDetection)
            {
                if (isUpdateupperAxisEventEnabled)
                {
                    reslutUpperAxisEvent();
                }
            }

            if (isYaxisInput && !isYaxisPlus && isYaxisDetection)
            {
                if (isUpdatedownAxisEventEnabled)
                {
                    reslutDownAxisEvent();
                }
            }

            if (!isYaxisInput && isXaxisPlus && isXaxisDetection)
            {
                if (isUpdaterightAxisEventEnabled)
                {
                    reslutRightAxisEvent();
                }
            }

            if (!isYaxisInput && !isXaxisPlus && isXaxisDetection)
            {
                if (isUpdateleftAxisEventEnabled)
                {
                    resultLeftAxisEvent();
                }
            }
        }
    }

    void reslutRightAxisEvent()
    {
        OnUpdateRightAxisEvent.Invoke();
        isUpdateRightAxisEventEnabled = false;
    }

    void resultLeftAxisEvent()
    {
        OnUpdateLeftAxisEvent.Invoke();
        isUpdaterLedtAxisEventEnabled = false;
    }

    void reslutUpperAxisEvent()
    {
        OnUpdateUpAxisEvent.Invoke();
        isUpdateUpperAxisEventEnabled = false;
    }

    void reslutDownAxisEvent()
    {
        OnUpdateDownAxisEvent.Invoke();
        isUpdateDownAxisEventEnabled = false;
    }
    /// <summary>
    /// Holdを検知します。MRTKのInteractableReceiverからイベントを実行します。
    /// </summary>
    public void leverHoldStat()
    {
        Debug.Log("leverActionStart");
        isActionEnebled = true;
    }
    /// <summary>
    /// MRTKのInteractableReceiverからイベントを実行します。
    /// </summary>
    public void leverHoldEnd()
    {
        Debug.Log("leverActionEnd");
        isActionEnebled = false;
        this.gameObject.transform.localPosition = new Vector3(0, 0, 0);
        isUpdateUpperAxisEventEnabled = true;
        isUpdateDownAxisEventEnabled = true;
        isUpdateRightAxisEventEnabled = true;
        isUpdateLeftAxisEventEnabled = true;
    }

}