夜風のMixedReality

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

MRDL Surfacesを学ぶ FingerSurfac クラス継承についてさらう

本日はMRDLのSurfaceを学んでいきます。

〇Volume

[StartupScene]でHandMenuから[Cube]ボタンを押すことで[Volume]シーンがロードされます。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

この[Volume]シーンでは[Smoke]オブジェクトにアタッチされている[Volume]コンポーネントで[Cube]シーンの動きを実現しています。

f:id:Holomoto-Sumire:20210331085053j:plain

[Volume]コンポーネント

using ...
public class Volume : HandSurface
{
...
}

のように[HandSurface]クラスからの継承クラスとなっています。

using ...
public class HandSurface : FingerSurface
{
...
}

この[HandSurface]クラスはさらに[FingerSurface]クラスからの継承クラスとなっています。

今回はこの[FingerSurface]クラスを見ていきます。 筆者はUnityからすべてを始めたのでC#の基本であるクラス継承に関してあまり理解していないところもあるので今回はクラス継承に関してさらいながら読み解いていきます。

using Microsoft.MixedReality.Toolkit;
using Microsoft.MixedReality.Toolkit.Input;
using Microsoft.MixedReality.Toolkit.Utilities;
using Microsoft.MRDL;
using UnityEngine;

public class FingerSurface : MonoBehaviour
{
public static FingerSurface ActiveSurface { get { return activeSurface; } }
    private static FingerSurface activeSurface;

    public bool Initialized { get; private set; }

    public virtual float SurfaceRadius { get { return 0.125f; } }

    public Vector3 SurfacePosition { get; protected set; }

    [Header("Finger objects")]
    [SerializeField]
    protected Transform[] fingers;
    [SerializeField]
    protected Transform[] palms;
    [SerializeField]
    protected bool disableInactiveFingersInEditor = true;

    [Header("Finger Physics")]
    [SerializeField]
    protected Rigidbody[] fingerRigidBodies;
    [SerializeField]
    protected Collider[] fingerColliders;
    [SerializeField]
    protected Rigidbody[] palmRigidBodies;
    [SerializeField]
    protected Collider[] palmColliders;

    [Header("Surface")]
    [SerializeField]
    protected Transform surfaceTransform;

    protected ContextualHandMenu menu;
  ...
}

FingerSurfaceはMonobegaviourからの継承クラスでUnityで多く使用される形となっています。

〇protected修飾子

protected修飾子は基底クラス(この場合FingerSurfaceクラス)だけではなく基底クラスを継承したサブクラス(継承クラス)でも参照されます。

例えば[Finger objects]の場合

 [Header("Finger objects")]
    [SerializeField]
    protected Transform[] fingers;
    [SerializeField]
    protected Transform[] palms;
    [SerializeField]
    protected bool disableInactiveFingersInEditor = true;

次の様にサブクラスである[Volume]コンポーネントでも参照されています。

f:id:Holomoto-Sumire:20210331092123j:plain

これによってSurfacesで体験できる9つのシーンそれぞれに共通した機能を基底クラス(スーパークラス)から継承させて使用します。

[FingerSurface]のコードに関しては長いため次をご覧ください

github.com