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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

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

Q&A

解決済

1回答

351閲覧

【Unity・ARkit】生成されたオブジェクトが回転操作できない

Chikamori

総合スコア8

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Unity

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

0グッド

0クリップ

投稿2017/12/22 01:05

###前提・実現したいこと
ここに質問したいことを詳細に書いてください
(例)Unity2017でiOSのARアプリを制作しています。
ARkitをpluginし、認識している平面をタップしてオブジェクトを生成することはできたのですが、
生成されたオブジェクトをボタンUiをタップ(押し続ける)ことで回転操作をすることができません。
回転操作ができるように改善を行いたいです。

ボタンUiをタップしても何も反応しない。

###該当のソースコード

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Rotate1 : MonoBehaviour { public float speed = 1; bool push = false; public void PushDown() { push = true; } public void PushUp() { push = false; } // Use this for initialization void Start () { } // Update is called once per frame void Update() { if (push) { transform.Rotate(new Vector3(0, 1, 0)); } } }

###試したこと
UnityAsset"TouchScript"を使用しています。
生成されたオブジェクトには回転用スクリプト"Rotate1.CS"をアタッチしてます。(上記のソースコード)
ボタンにEvent Triggerをアタッチして、"Rotate1"を使用して生成されたオブジェクトの回転操作ができるように設定しました。しかし実機確認してもボタンが反応しないです。
イメージ説明

###補足情報(言語/FW/ツール等のバージョンなど)
Unity ver: 2017 2.0f3
実機デバイス:iPhone7 (iOS:10.12)

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらく、Event Triggerにプレハブを指定しているからだと思います。
「Rotate1」を含むオブジェクトをシーンに配置し、Event Triggerにプレハブの代わりにそれを指定することで、正しく動作するようになると思います。

もし、「Rotate1」を含むオブジェクトをプレハブから生成したい場合は、以下のようにすることで、Event Triggerに動的に追加することが出来るようになります。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5 6public class InstantiateRotate1 : MonoBehaviour 7{ 8 // 生成したい「Rotate1」が含まれているプレハブを指定 9 public GameObject InstantiatePrefab; 10 11 // 処理を追加したいボタンの「EventTrigger」を指定 12 // (プレハブではなく、シーン上に配置済みのボタンを指定すること) 13 public EventTrigger ButtonEventTrigger; 14 15 void Start() 16 { 17 GameObject obj = Instantiate(InstantiatePrefab); 18 Rotate1 rotate1 = obj.GetComponent<Rotate1>(); 19 EventTrigger trigger = ButtonEventTrigger.GetComponent<EventTrigger>(); 20 21 EventTrigger.Entry entry1 = new EventTrigger.Entry(); 22 entry1.eventID = EventTriggerType.PointerDown; 23 entry1.callback.AddListener((data) => { rotate1.PushDown(); }); 24 trigger.triggers.Add(entry1); 25 26 EventTrigger.Entry entry2 = new EventTrigger.Entry(); 27 entry2.eventID = EventTriggerType.PointerUp; 28 entry2.callback.AddListener((data) => { rotate1.PushUp(); }); 29 trigger.triggers.Add(entry2); 30 } 31}

追記:
このスクリプトをそのまま使うのではなく、ObjectMakerに同様の処理を追加してください。
今回の場合は以下のようになるでしょう。

C#

1public class ObjectMaker : MonoBehaviour 2{ 3 4 public GameObject obj; 5 6 public EventTrigger ButtonEventTrigger; //追加 7 8 void CreateObj(Vector3 atPosition) 9 { 10 GameObject newBall = Instantiate(obj, atPosition, Quaternion.identity); 11 12 // ここから追加 13 14 Rotate1 rotate1 = newBall.GetComponent<Rotate1>(); 15 EventTrigger trigger = ButtonEventTrigger.GetComponent<EventTrigger>(); 16 17 EventTrigger.Entry entry1 = new EventTrigger.Entry(); 18 entry1.eventID = EventTriggerType.PointerDown; 19 entry1.callback.AddListener((data) => { rotate1.PushDown(); }); 20 trigger.triggers.Add(entry1); 21 22 EventTrigger.Entry entry2 = new EventTrigger.Entry(); 23 entry2.eventID = EventTriggerType.PointerUp; 24 entry2.callback.AddListener((data) => { rotate1.PushUp(); }); 25 trigger.triggers.Add(entry2); 26 27 // ここまで追加 28 } 29 30 // 以下、省略

投稿2017/12/22 02:33

編集2017/12/22 10:02
fiveHundred

総合スコア9797

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

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

Chikamori

2017/12/22 08:06

回答ありがとうございます。ボタンでオブジェクトを回転させることができました! しかし、オブジェクトが認識した平面とは違う場所に生成されてしまいます。 回答いただいたスクリプトの適用方法が間違っているのでしょうか? ※状況としてはタップした際タップした位置の平面にオブジェクトが生成されるスクリプトの代わりに回答でいただいたスクリプトをアタッチしている。 以下、使用していた生成スクリプト"ObjectMaker.CS" using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.XR.iOS; public class ObjectMaker : MonoBehaviour { public GameObject obj; void CreateObj(Vector3 atPosition) { GameObject newBall = Instantiate(obj, atPosition, Quaternion.identity); } void Update() { // タッチ入力確認 if (Input.touchCount > 0) { var touch = Input.GetTouch(0); if (touch.phase == TouchPhase.Began) { var screenPosition = Camera.main.ScreenToViewportPoint(touch.position); ARPoint point = new ARPoint { x = screenPosition.x, y = screenPosition.y }; // スクリーンの座標をWorld座標に変換 List<ARHitTestResult> hitResults = UnityARSessionNativeInterface.GetARSessionNativeInterface().HitTest(point, ARHitTestResultType.ARHitTestResultTypeExistingPlaneUsingExtent); if (hitResults.Count > 0) { foreach (var hitResult in hitResults) { Vector3 position = UnityARMatrixOps.GetPosition(hitResult.worldTransform); CreateObj(new Vector3(position.x, position.y, position.z)); break; } } } } } }
fiveHundred

2017/12/22 10:03 編集

回答に追記しました
Chikamori

2017/12/22 10:32

素早い回答ありがとうございます!現在Unityを操作できない状況にあるので、回答いただいた方法で確認した後改めて報告したいと思います。とても勉強になり助かります!
Chikamori

2017/12/25 00:58

問題を無事解決することができました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問