質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

1703閲覧

unity Vuforia virtualButton

BitCoin

総合スコア53

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/10/27 17:44

編集2017/10/27 17:47

unity VuforiaのVirtualButtonについてです。

まず下のコードですが

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using Vuforia; 5 6public class vbScript : MonoBehaviour,Vuforia.IVirtualButtonEventHandler { 7 8 GameObject virtualButtonObject ; 9 10 // Use this for initialization 11 void Start () { 12 13 virtualButtonObject = GameObject.Find ("actionButton"); 14 virtualButtonObject.GetComponent<VirtualButtonBehaviour> ().RegisterEventHandler (this); 15 16 17 } 18 19 // Update is called once per frame 20 void Update () { 21 22 23 24 } 25 26 public void OnButtonPressed(VirtualButtonAbstractBehaviour vb){ 27 28 Debug.Log ("ButtonPressed"); 29 30 } 31 32 public void OnButtonReleased(VirtualButtonAbstractBehaviour vb){ 33 34 } 35 36} 37

これは私がVirtualButtonを実装するために
この動画をみて書いたものです。

ここでvirtualButtonObject.GetComponent<VirtualButtonBehaviour> ().RegisterEventHandler (this);

この意味なのですがこれは何をしているのでしょうか?
参考までに

C#

1public void RegisterEventHandler (IVirtualButtonEventHandler eventHandler);

次にオーバーライドについて質問です。
下のコードはIVirtualButtonEventHandler インターフェースのメソッドをオーバーライドしていると思うのですが
これでなぜVirtualButtonを認識できるようになるのでしょうか?
(VirtualButtonを認識できる実装はどこに書いてあるのか?)
よろしくお願いします。

C#

1public void OnButtonPressed(VirtualButtonAbstractBehaviour vb){ 2 3 Debug.Log ("ButtonPressed"); 4 5 } 6 7 public void OnButtonReleased(VirtualButtonAbstractBehaviour vb){ 8 9 }

C#

1using System; 2 3namespace Vuforia 4{ 5 public interface IVirtualButtonEventHandler 6 { 7 // 8 // Methods 9 // 10 void OnButtonPressed (VirtualButtonAbstractBehaviour vb); 11 12 void OnButtonReleased (VirtualButtonAbstractBehaviour vb); 13 } 14} 15

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

virtualButtonObject.GetComponent<VirtualButtonBehaviour> ().RegisterEventHandler (this);

VirtualButtonBehaviourにこのスクリプト(vbScript)を登録する。という意味です。

下のコードはIVirtualButtonEventHandler インターフェースのメソッドをオーバーライドしていると思うのですが
これでなぜVirtualButtonを認識できるようになるのでしょうか?
(VirtualButtonを認識できる実装はどこに書いてあるのか?)

前述のvirtualButtonObject.GetComponent<VirtualButtonBehaviour> ().RegisterEventHandler (this);で登録したからです。
その登録したvbScriptのOnButtonPressed()OnButtonReleased()を内部で呼び出しているのだと思います。

投稿2017/10/28 01:57

fiveHundred

総合スコア9796

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

BitCoin

2017/10/28 05:25

回答ありがとうございます。 virtualButtonObject.GetComponent<VirtualButtonBehaviour> ().RegisterEventHandler (this);は クラスを登録するという意味だったんですね。 ここで疑問なのですがVirtualButtonAbstractBehaviourクラスのRegisterEventHandler メソッドは public void RegisterEventHandler (IVirtualButtonEventHandler eventHandler);のように抽象クラスであるため実装がないです。 継承された public class VirtualButtonBehaviour : VirtualButtonAbstractBehaviourをみてみても RegisterEventHandlerメソッドはありませんでした。 これはどういうことなのでしょうか? 登録するという実装はわかるのですが、どのように登録しているのかメソッドの実装が描かれていないため混乱しております。
fiveHundred

2017/10/28 06:04

> public void RegisterEventHandler (IVirtualButtonEventHandler eventHandler);のように抽象クラスであるため実装がないです。 とのことですが、本当に実装が無いのであれば、関数自身にabstractが付くはずです。 確かvuforiaのSDKは、Managedのdllを使って、一部の処理を隠しているはずなので、RegisterEventHandler()もその一つだろうと思います。 (最近はvuforiaを触っていないので、もし状況が異なっていたらすいません)
BitCoin

2017/10/28 13:26

返信ありがとうございます。 public void RegisterEventHandler (IVirtualButtonEventHandler eventHandler); とあるため抽象メソッドではないですね。 Managedのdllを使って1部の処理を隠すことができるのですね。 初めて知りました。ということは例えばunityのAPIのtransfromクラスのtranslateメソッドを見てみると [ExcludeFromDocs] public void Translate (float x, float y, float z); とあり、実装が見えないのですがこの仕組みもManagedのdllを使って実装を見せていないのでしょうか? 実装を隠すということについて、よろしければ詳しく説明していただけないでしょうか?
fiveHundred

2017/10/28 14:11

dll云々は、SDKを使ったときの話です。 2017.2以降ではUnityに組み込まれているようなので、そちらを使っている場合は、話が変わります。 (勝手にSDKを使っているのだと思い込んでいました。すいませんでした) unityのAPIの場合は、どのようになっているのかは私には分かりません。 先ほどの表現は、ソースファイルの代わりに事前にコンパイルしたdllを使うことが出来る、という意味で使いました。 Managedのdllの詳細については、以下のURLに書かれております。 https://docs.unity3d.com/jp/540/Manual/UsingDLL.html
BitCoin

2017/10/28 14:22

詳しくありがとうございます。 なるほど、ソースファイルの代わりに事前にコンパイルしたdllを使うことが出来るのですね。 この事前コンパイルというのは 例えばpublic void RegisterEventHandler が事前にコンパイルされ、 バイナリ化していて実装が見えないけど、自身が作ったクラスを登録する機能があるということでしょうか?
fiveHundred

2017/10/29 01:26

Visual StudioやMonoDevelopを使うことで、dllを作ることが出来ます。 そのdllはバイナリ化していて実装が見えないけれども、Unityで使えるdllであれば、そのdllの機能をスクリプトから呼び出したりすることが出来る、という意味です。 dllを作る方法は以下が参考になると思います。 https://qiita.com/r-ngtm/items/50afdb29c671001bb290
BitCoin

2017/10/29 12:15

URL拝見しました。 こんなことができるのですね! dllの正体はバイナリ化したコードだったのですね。 それを踏まえて質問なのですが、 例えば、今回のVirtualButtonのOnButtonPressedメソッドやRegisterEventHandlerメソッドですが、それぞれのメソッドの実装を確認できなければvirtualButtonを押したときに動作するメソッドが分からないと思います。 unityのAPIのtaransform.translateはリファレンスを見ればなんとなく動作を理解しうることができると思います。たまに、リファレンスを見ても何をするメソッドがわからなくてネットで資料を探したりしますが・・・ Vuforiaのリファレンスは英語でしか書いておらず、メソッドの動作を理解するにはどうすればいいのでしょうか?
fiveHundred

2017/10/29 12:30

自分だったら、日本語で解説しているサイトを探してみて、もし無ければChromeの翻訳機能を使いながら英語のリファレンスやドキュメントを読みますね。
BitCoin

2017/10/29 13:43

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問