ARアプリ Input Manager部分をInput System対応に書き換える

AR

本アプリの入力に司る部分のコードは、Input Manager対応のものとInput System対応のものが混在していますが、両方使える設定にしていたので特に問題なく稼働する状態でした

しかし、リリース版にする方法を調べたところ、どうやらこの設定をどちらかにしないと次のステップへ進めないことが分かりました

どうせ統一するなら新システムであるInput Systemにしようということで、今回既存プログラムのInput Manager部分をInput Systemに書き換えることにチャレンジしてみました!



結果

書き換えたものの一部を記載します

オブジェクトのレイヤー切り替えに関する部分のコードになります

こちらは書き換え前↓

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

public class Move : MonoBehaviour
{
    public static GameObject movObj;        
   
        bool IsOver()
    {
        if (EventSystem.current.currentSelectedGameObject != null) { return true; }
        if (EventSystem.current.IsPointerOverGameObject()) { return true; }
        if (Input.touchCount > 0 && EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) { return true; }
        return false;
    }
    bool IsDown = false;
    IEnumerator Judge()
    {
        yield return new WaitForEndOfFrame();
        if (IsOver()) yield break; else IsDown = true;       
    }
    void OnMouseDown()
    {
        StartCoroutine(Judge());
    }
   
    void OnMouseUp()
    {
        if (!IsDown) return; else IsDown = false; 
        if (IsOver()) return;       
        if (movObj == this.gameObject) return;    
        if (movObj != null && movObj != this.gameObject)
        {
            movObj.layer = LayerMask.NameToLayer("Default");
        }
        
        this.gameObject.layer = LayerMask.NameToLayer("Outline");       
        movObj = this.gameObject;
        // BoxSizeAdjusterの参照を取得し、選択されたオブジェクトを設定
        BoxSizeAdjuster.Instance.SetTargetObject(gameObject);        
    }
}

if (Input.touchCount > 0 && EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) { return true; }
return false;

のInputの部分。

そしてOnMouseDown()とOnMouseUp()がInput Manager対応なので書き換えが必要となります

書き換え後↓

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.EventSystems;
using UnityEngine.InputSystem;
using UnityEngine.InputSystem.EnhancedTouch;//20250203追加
using Touch = UnityEngine.InputSystem.EnhancedTouch.Touch;


public class Move : MonoBehaviour
{
    public static GameObject movObj;  

    public void Start()
    {
        EnhancedTouchSupport.Enable();        
    }

    private void OnDisable()
    {      
        EnhancedTouchSupport.Disable();
    }  

    private void Update()//タッチの検出および判定
    {
        foreach (Touch touch in Touch.activeTouches)//タッチ履歴取得
        {
            if (touch.phase == UnityEngine.InputSystem.TouchPhase.Began)//判定するタッチを1つに限定
            {
               
                if (EventSystem.current.IsPointerOverGameObject()) return;//UIに触れているかどうか
                //タッチを1つに絞らないと警告が出る

                DetectTouch(touch.screenPosition);//UIでなければこれを実行
            }
        }
    }
   private void DetectTouch(Vector2 touchPosition)
   {
       
       Ray ray = Camera.main.ScreenPointToRay(touchPosition);//クリックした場所にレイを飛ばす
       RaycastHit hit = new RaycastHit();

       if (Physics.Raycast(ray, out hit) != false)
       {
           if (hit.collider.gameObject.CompareTag("arplane")) return;   
           if (hit.collider.gameObject.layer == LayerMask.NameToLayer("UI")) return;        
           if (hit.collider.gameObject == null) return;                            
           if (movObj != null && hit.collider.gameObject == movObj) return;

           //タップしたオブジェクトが選択オブジェクトではない場合選択オブジェクトのアウトラインを外す
           if (hit.collider.gameObject.CompareTag("d_obj"))
               if (movObj != null && hit.collider.gameObject != movObj)
               {
                   movObj.layer = LayerMask.NameToLayer("Default");

                   //選択オブジェクトにアウトラインを付ける
                   //オブジェクト配置時に付いてしまうのでCreateObjectで実行
                   //hit.collider.gameObject.layer = LayerMask.NameToLayer("Outline");
               }
           movObj = this.gameObject;
           // BoxSizeAdjusterの参照を取得し、選択されたオブジェクトを設定
           BoxSizeAdjuster.Instance.SetTargetObject(gameObject);           
       }
       
   }
もふもふ
もふもふ

変わりすぎもふ(;゚Д゚)

EnhancedTouchを使用することでクリアすることが出来ました!

しかし、OnMouseDown()やOnMouseUp()で触れたものがオブジェクトかどうかまで判別してくれていたのですが、使用できなくなったことにより、その判定を補うためにレイキャストによる判定を盛り込まなければならなくなってしまいました



まとめ

Unity上でのシミュレートでは問題なく動作したのですが、実機にビルドしたところフリーズしてしまったので、そちらを究明していこうと思います

タイトルとURLをコピーしました