ぼくの息抜き

ぼくの息抜き

気ままな二人が記事を書くことで息抜きしていくブログ

CSS MenuMaker

【VR,OculusGo,Unity】素人がコントローラーでオブジェクトを動かす のコード

【VR,OculusGo,Unity】素人がコントローラーでオブジェクトを動かす

のコード

元記事

www.bokunoikinuki.com

以下お二人のコードを参考にしています。

ありがとうございます。

fantom1x.blog130.fc2.com

 

rikoubou.hatenablog.com

 

コード

LaserPointer

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


public class LaserPointer : MonoBehaviour
{
    public bool IsActive = true;            //稼働フラグ
    public float defaultLength = 0.5f;      //ヒットなしのときのレーザーの長さ

    public bool shotRay = true;             //Ray を撃つ(false のときは target に指す位置を入れる)
    public float rayLength = 500f;          //Ray の長さ
    public LayerMask rayExclusionLayers;    //Ray 判定を除外するレイヤー

    public Transform target;                //指す位置(shotRay=true のときはヒットしたオブジェクトの transform が入る)

    [SerializeField]
    Transform rightHandAnchor;   

    [SerializeField]
    Transform leftHandAnchor;  

    [SerializeField]
    Transform centerEyeAnchor;

    public LineRenderer lineRenderer;       //レーザーを描画するラインレンダラ

    PointerManager manager;

    private Transform anchor {
        get {
            // 現在アクティブなコントローラーを取得
            var controller = OVRInput.GetActiveController();

            if (controller == OVRInput.Controller.RTrackedRemote) {
                return rightHandAnchor;
            } else if (controller == OVRInput.Controller.LTrackedRemote) {
                return leftHandAnchor;
            } 

            return centerEyeAnchor;
        }
    }

    // Use this for initialization
    void Awake()
    {
        if (lineRenderer == null) {
            lineRenderer = GetComponent<LineRenderer>();
        }

        // ヒット時のPointer取得
        manager = transform.Find ("Pointer").GetComponent<PointerManager> ();
    }

    // Update is called once per frame
    void Update()
    {
        if (!IsActive)
        {
            lineRenderer.enabled = false;
            return;
        }

        if (shotRay)
        {   
            Ray ray = new Ray(anchor.position, anchor.forward);
            RaycastHit hit;
            if (Physics.Raycast(ray, out hit, rayLength, ~rayExclusionLayers))
            {
                target = hit.transform;
                DrawTo(hit.point);     //ヒットした位置にしたいため

                // ヒットオブジェクト取得
                GetHitObject(hit);

                // ヒット地点にPointer表示
                manager.SetPointer(hit.point);

                return;
            }

            target = null;
        }

        if (target != null)
            DrawTo(target.position);
        else
            DrawTo(anchor.position + anchor.forward * defaultLength);   //コントローラの正面方向へ一定の長さ

            // ヒットしてない時は隠す
            manager.HidePointer();
    }

    //レーザーを描く
    void DrawTo(Vector3 pos)
    {
        lineRenderer.enabled = true;
        lineRenderer.SetPosition(0, anchor.position);
        lineRenderer.SetPosition(1, pos);
    }

    void GetHitObject (RaycastHit hit) {
        // ヒットしたオブジェクトを取得
        GameObject obj = hit.collider.gameObject;

        if (OVRInput.Get (OVRInput.Button.PrimaryIndexTrigger)) {
            obj.transform.position += new Vector3 (0, 0.1f, 0);
        }
        
        if (OVRInput.Get (OVRInput.Button.PrimaryTouchpad)) {
            obj.transform.position += new Vector3 (0, -0.1f, 0);
        }
    }
}