Last active
September 14, 2023 15:01
-
-
Save javel555/c46942d50143e0346b5dfbd16a3e620d to your computer and use it in GitHub Desktop.
ProjectH GameManager.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using UnityEngine.InputSystem; | |
using UnityEngine.XR.Management; | |
using Unity.XR.CoreUtils; | |
public class GameManager : MonoBehaviour | |
{ | |
[SerializeField] | |
private Camera m_MainCamera; | |
[SerializeField] | |
private XROrigin m_XROrigin; | |
[SerializeField] | |
private Transform m_Head; | |
[SerializeField] | |
private GameObject m_PlayerRoot; | |
[SerializeField] | |
private Transform m_Enemies; | |
[SerializeField] | |
private RectTransform m_Canvas; | |
[SerializeField] | |
private RectTransform m_Marker; | |
private const float H_MOVE_SPEED = 5; | |
private const float H_ROTATE_SPEED = 50; | |
private const float H_ROTATE_SENSITIVITY = 1; | |
void Update() | |
{ | |
// ---------- 顔の向きに移動する ---------- | |
var headForward = m_Head.localRotation * Vector3.forward; | |
m_PlayerRoot.transform.Translate(headForward * H_MOVE_SPEED * Time.deltaTime); | |
// Debug.Log($"forward={headForward}, rotate={headRotate}"); | |
// TODO 高度下限、高度上限を付ける | |
// TODO 画面外どうする -> 円形に逸脱上限を設けるだけで良い気がする。意外と「進めない事」に気づかない ・・・ あるいは「進めない事」に気づかせるべきなのか | |
// ---------- 首をかしげると旋回する ---------- | |
var headRotate = m_Head.localEulerAngles; | |
var rolle = headRotate.z < 180 ? headRotate.z : headRotate.z - 360; // 値域を0~360から-180~180に変更 | |
var rotateWeight = Mathf.SmoothStep(0, 1, Mathf.Abs(rolle) / 180 * H_ROTATE_SENSITIVITY); | |
m_PlayerRoot.transform.Rotate( | |
Vector3.up, -rolle * rotateWeight * H_ROTATE_SPEED * Time.deltaTime, Space.World); | |
// m_XROrigin.RotateAroundCameraUsingOriginUp( // FIXME これもだめ | |
// Mathf.Sign(-rolle) * rotateWeight * H_ROTATE_SPEED * Time.deltaTime); | |
// Debug.Log($"rolle={rolle}, rotateWeight={rotateWeight}"); | |
// ---------- PCで動かす用(マウスで移動)---------- | |
if (!(XRGeneralSettings.Instance && XRGeneralSettings.Instance.Manager.activeLoader != null)) // HMDが接続されてるかどうか | |
{ | |
var mouseMove = Mouse.current.delta.ReadValue(); | |
var nowPitch = m_PlayerRoot.transform.localEulerAngles.x; | |
Debug.Log(nowPitch); | |
// if (-89 < nowPitch || nowPitch < 89) // ピッチは、下向きが正の数、上向きが負の数 | |
// { | |
float maxLimit = 90, minLimit = 360 - maxLimit; | |
var p = m_PlayerRoot.transform.localEulerAngles; | |
p.x += -mouseMove.y; | |
if(p.x > maxLimit && p.x < 180) p.x = maxLimit; // ピッチの向きに制限を設けて、背面飛行しないようにする | |
if(p.x < minLimit && p.x > 180) p.x = minLimit; | |
m_PlayerRoot.transform.localEulerAngles = p; | |
// m_PlayerRoot.transform.Rotate( | |
// Vector3.right, -mouseMove.y, Space.Self); | |
// } | |
var y = m_PlayerRoot.transform.eulerAngles; | |
y.y += mouseMove.x; | |
m_PlayerRoot.transform.eulerAngles = y; | |
// m_PlayerRoot.transform.Rotate( | |
// Vector3.up, mouseMove.x, Space.World); | |
// Debug.Log($"mouse={mouseMove}"); | |
} | |
// TODO 一定範囲に居る敵のスクリーン座標を取って、ロックオンする | |
m_Marker.gameObject.SetActive(false); | |
var nowPos = m_XROrigin.transform.position; | |
foreach (Transform e in m_Enemies) | |
{ | |
var len = (e.position - nowPos).sqrMagnitude; | |
if (len > 100 * 100) continue; // 最長射程 | |
if (len < 5 * 5) continue; // 最短射程 | |
var screenPos = m_MainCamera.WorldToScreenPoint(e.position); | |
if (screenPos.z < 0) continue; | |
// Debug.Log($"ScreenPos={screenPos}"); | |
// 数字が画面サイズに影響を受けてるので、その辺の考え方が必要・・・ | |
// アスペクト比固定にするか? とか | |
// あるいは何とかして論理空間で事を済ませたいが・・・ | |
// - | |
// クリック位置に対応するRectTransformのlocalPositionを計算する | |
var localPoint = Vector2.zero; | |
RectTransformUtility.ScreenPointToLocalPointInRectangle(m_Canvas, screenPos, m_MainCamera, out localPoint); | |
if (!m_Canvas.rect.Contains(localPoint)) continue; | |
// ローカル座標にインスタンス生成 | |
m_Marker.localPosition = localPoint; | |
m_Marker.gameObject.SetActive(true); | |
// TODO なんか巻き戻ってる??? | |
// VRで見た時に眼前にあって見づらいのをどうにかするのが無い??? | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment