Skip to content

Instantly share code, notes, and snippets.

@javel555
Last active September 14, 2023 15:01
Show Gist options
  • Save javel555/c46942d50143e0346b5dfbd16a3e620d to your computer and use it in GitHub Desktop.
Save javel555/c46942d50143e0346b5dfbd16a3e620d to your computer and use it in GitHub Desktop.
ProjectH GameManager.cs
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