ジャイロ(Gyro)で視差
環境
Unity2022.3.1f1
概要
ジャイロを使用した以下のツイートのような事をしたかったので試してみました。
スマホをひっくり返すと後部が見えます。
プログラムには傾斜錐台を使用しています。
Loco Looper’s sweet holographic effect on iPhone and iPad.
— James Vanas (@jamesvanas) 2021年8月20日
It’s tough going back to flat 2D games after this!#screenshotsaturday pic.twitter.com/5X26INPgda
コード
using UnityEngine; using TMPro; public class ObliqueProjection : MonoBehaviour { [SerializeField] private Camera _camera = null; [SerializeField] private TextMeshProUGUI _text = null; [SerializeField] [Range(-1f,1f)] private float _horizontal = 0.0f; [SerializeField] [Range(-1f,1f)] private float _vertical = 0.0f; private Vector3 _org_position; private float _distance; void OnEnable() { _org_position = _camera.transform.localPosition; _distance = _org_position.magnitude; Input.gyro.enabled = true; #if UNITY_EDITOR Input.gyro.enabled = false; #endif } void OnDisable() { } void LateUpdate() { if(Input.gyro.enabled == true) { const float scale = 1.0f; const float offset = 1.0f; _horizontal = Mathf.Clamp(Input.gyro.gravity.x * scale, -1.0f, 1.0f); _vertical = Mathf.Clamp(Input.gyro.gravity.y * scale + offset, -1.0f, 1.0f); } var cam = _camera; var rect = cam.pixelRect; var ratio = (float)rect.height / (float)rect.width; _text.text = $"horizontal:{_horizontal} vertical:{_vertical}"; cam.ResetProjectionMatrix(); var proj = cam.projectionMatrix; proj.m02 = _horizontal * ratio; proj.m12 = _vertical; cam.projectionMatrix = proj; var tan = Mathf.Tan(cam.fieldOfView*0.5f*Mathf.Deg2Rad); _camera.transform.localPosition = _org_position + new Vector3(-_horizontal * _distance * tan, 0.0f, -_vertical * _distance * tan); } }