174 lines
5.6 KiB
C#
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();
|
|
}
|
|
}
|
|
}
|