2026-05-07 10:14:44 +02:00

174 lines
5.6 KiB
C#

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using DG.Tweening;
using System;
using Wing.Utils;
namespace Wing.Gizmos
{
public class CameraNavigator : MonoBehaviour
{
public const int ElementType = 999;
public Vector3 Pos = new Vector3(0.8f, 0.8f, 1);
public enum ENaviType
{
PX,
NX,
PY,
NY,
PZ,
NZ,
Center,
}
public Camera RendererCamera;
public GameObject NaviRoot;
private List<GameObject> Navis = new List<GameObject>();
private List<Vector3> _angles = new List<Vector3>() {
Vector3.left, Vector3.right,
Vector3.down, Vector3.up,
Vector3.back, Vector3.forward,
Vector3.zero };
private List<Color> _colors = new List<Color>() {
Color.red, Color.white,
Color.green, Color.white,
Color.blue, Color.white,
Color.white };
private List<MeshRenderer> _naviRenders = new List<MeshRenderer>();
private Camera _camera;
private bool _enableNaviUpdate = true;
private TouchInteraction _interacton;
void Start()
{
_camera = Camera.main;
this.gameObject.SetLayerWithChildren(Settings.NavLayerName);
var displayCam = this.gameObject.GetComponentInChildren<Camera>();
if(displayCam != null)
{
displayCam.cullingMask = 1 << this.gameObject.layer;
}
_interacton = this.gameObject.AddComponent<TouchInteraction>();
_interacton.Set(RendererCamera, 1 << this.gameObject.layer);
_interacton.HoverTargetChangedEvent += _interacton_HoverTargetChangedEvent;
_interacton.SelectedEvent += _interacton_SelectedEvent;
for (int i = 0; i < NaviRoot.transform.childCount; i++)
{
Transform t = NaviRoot.transform.GetChild(i);
Navis.Add(t.gameObject);
MeshRenderer mr = t.GetComponent<MeshRenderer>();
_naviRenders.Add(mr);
}
}
private void _interacton_SelectedEvent(ElementTag tag)
{
if (!_enableNaviUpdate)
{
return;
}
for (int i = 0; i < Navis.Count; i++)
{
_naviRenders[i].material.color = _colors[i];
Navis[i].SetActive(true);
}
if (tag != null)
{
int id = int.Parse(tag.ID);
if (id == (int)ENaviType.Center)
{
//CameraCtrl.Instance.Reset(CameraCtrl.Instance.StateType, CameraCtrl.Instance.Locked, true);
}
else
{
_enableNaviUpdate = false;
//var currentAngle = _camera.transform.forward;
//var targetAngle = _angles[id];
var euler = Quaternion.LookRotation(_angles[id], Vector3.up).eulerAngles;
Color color = _naviRenders[id].material.color;
Tweener tweener = _camera.transform.DORotate(euler, 0.5f);
tweener.OnComplete(() =>
{
_enableNaviUpdate = true;
Navis[id].SetActive(false);
}).OnUpdate(() =>
{
color.a = 1 - tweener.timeScale;
_naviRenders[id].material.color = color;
}).Play();
//_camera.gameObject.Tween(0.5f)
// .SetUpdate((scale) =>
// {
// color.a = 1 - scale;
// _naviRenders[id].material.color = color;
// _camera.transform.forward = Vector3.Slerp(currentAngle, targetAngle, scale);
// }).
// SetComplete(() =>
// {
// _enableNaviUpdate = true;
// Navis[id].SetActive(false);
// _camera.transform.forward = targetAngle;
// return false;
// }).
// Play();
}
}
}
private void _interacton_HoverTargetChangedEvent(ElementTag tag)
{
if (_interacton.LastSelectedTag != null)
{
int id = int.Parse(_interacton.LastSelectedTag.ID);
_naviRenders[id].material.color = _colors[id];
}
if (tag != null)
{
int id = int.Parse(tag.ID);
ENaviType ntype = (ENaviType)id;
Color color = _naviRenders[id].material.color * 0.3f;
color.a = 1;
_naviRenders[id].material.color = color;
}
}
private void UpdateNavi()
{
NaviRoot.transform.eulerAngles = -_camera.transform.eulerAngles;
Vector3 angles = _camera.transform.eulerAngles;
float min = 20;
if (Mathf.Abs(angles.x % 90) > min ||
Mathf.Abs(angles.y % 90) > min ||
Mathf.Abs(angles.z % 90) > min)
{
for (int i = 0; i < Navis.Count; i++)
{
_naviRenders[i].material.color = _colors[i];
Navis[i].SetActive(true);
}
}
}
void Update()
{
UpdateNavi();
}
}
}