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 Navis = new List(); private List _angles = new List() { Vector3.left, Vector3.right, Vector3.down, Vector3.up, Vector3.back, Vector3.forward, Vector3.zero }; private List _colors = new List() { Color.red, Color.white, Color.green, Color.white, Color.blue, Color.white, Color.white }; private List _naviRenders = new List(); 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(); if(displayCam != null) { displayCam.cullingMask = 1 << this.gameObject.layer; } _interacton = this.gameObject.AddComponent(); _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(); _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(); } } }