MRTKを基にHoloLensで使用できるオリジナルのUIを作成します。
過去にSFチックのUIを作成していました。 今回はシリーズ続編としての第三回です。
〇第一弾
〇第二弾
本シリーズで作成したものは以下でMITライセンスで公開しています。(自由に使ってください)
今回第三弾はレバー(stick)型のUIを作っています。今までは動かすためにざっと書いてきたコードですがブログやgitHub等で紹介する際にとりあえず付けた変数名がわかりずらいのでよい機会なので変数名をわかりやすく変更します。
〇プログラミングの命名規則
フィールド名には Pascal 形式を使用してください
フィールドの名前には、名詞や名詞句を使用してください。
フィールド名にはプリフィックスを使用しないでください。 たとえば、静的フィールドと非静的フィールドを区別するために、g や s を使用しないでください。
とあります。
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;
}
}