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

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

ただいまの
回答率

90.51%

  • iOS

    3985questions

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

  • Unity

    3977questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

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

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 326

Chikamori

score 2

前提・実現したいこと

ここに質問したいことを詳細に書いてください
(例)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)

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class InstantiateRotate1 : MonoBehaviour
{
    // 生成したい「Rotate1」が含まれているプレハブを指定
    public GameObject InstantiatePrefab;

    // 処理を追加したいボタンの「EventTrigger」を指定
    // (プレハブではなく、シーン上に配置済みのボタンを指定すること)
    public EventTrigger ButtonEventTrigger;

    void Start()
    {
        GameObject obj = Instantiate(InstantiatePrefab);
        Rotate1 rotate1 = obj.GetComponent<Rotate1>();
        EventTrigger trigger = ButtonEventTrigger.GetComponent<EventTrigger>();

        EventTrigger.Entry entry1 = new EventTrigger.Entry();
        entry1.eventID = EventTriggerType.PointerDown;
        entry1.callback.AddListener((data) => { rotate1.PushDown(); });
        trigger.triggers.Add(entry1);

        EventTrigger.Entry entry2 = new EventTrigger.Entry();
        entry2.eventID = EventTriggerType.PointerUp;
        entry2.callback.AddListener((data) => { rotate1.PushUp(); });
        trigger.triggers.Add(entry2);
    }
}

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

public class ObjectMaker : MonoBehaviour
{

    public GameObject obj;

    public EventTrigger ButtonEventTrigger; //追加

    void CreateObj(Vector3 atPosition)
    {
        GameObject newBall = Instantiate(obj, atPosition, Quaternion.identity);

        // ここから追加

        Rotate1 rotate1 = newBall.GetComponent<Rotate1>();
        EventTrigger trigger = ButtonEventTrigger.GetComponent<EventTrigger>();

        EventTrigger.Entry entry1 = new EventTrigger.Entry();
        entry1.eventID = EventTriggerType.PointerDown;
        entry1.callback.AddListener((data) => { rotate1.PushDown(); });
        trigger.triggers.Add(entry1);

        EventTrigger.Entry entry2 = new EventTrigger.Entry();
        entry2.eventID = EventTriggerType.PointerUp;
        entry2.callback.AddListener((data) => { rotate1.PushUp(); });
        trigger.triggers.Add(entry2);

        // ここまで追加
    }

    // 以下、省略

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/22 17: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;
    }
    }
    }
    }
    }
    }

    キャンセル

  • 2017/12/22 19:03 編集

    回答に追記しました

    キャンセル

  • 2017/12/22 19:32

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

    キャンセル

  • 2017/12/25 09:58

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

    キャンセル

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

  • ただいまの回答率 90.51%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • iOS

    3985questions

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

  • Unity

    3977questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。