Files
Main/Assets/Editor/DIY/PreviewScene/PreviewSceneEditor.cs

325 lines
10 KiB
C#
Raw Permalink Normal View History

2025-01-25 04:38:09 +08:00
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using Thousandto.Core.Asset;
using PathEditor.Proxy.Plugin;
using System.IO;
using Thousandto.Core.Base;
using UnityEngine.SceneManagement;
using Thousandto.Cfg.Data;
using Thousandto.Launcher.ExternalLibs;
public class PreviewSceneEditor : EditorWindow
{
[MenuItem("Ares/场景预览")]
static void Open()
{
if (!Application.isPlaying)
{
EditorUtility.DisplayDialog("提示", "播放状态下才能打开预览器!", "确定");
return;
}
var win = (PreviewSceneEditor)EditorWindow.GetWindow(typeof(PreviewSceneEditor), true);
win.Show();
}
private List<MeshCollider> _collider = new List<MeshCollider>();
private GameObject _cameraGo = null;
private PreviewSceneCamera _cameraCol = null;
private GameObject _playerGo = null;
private AnimationPlayer _playerAnim = null;
private float _syncTime = 0f;
private Ray _hitRay = new Ray();
private bool wDown = false;
private bool sDown = false;
private bool aDown = false;
private bool dDown = false;
private bool _isMoving = false;
private Vector3 _moveDir = Vector3.zero;
private bool _useGirdData = false;
private PathGirdData _gridData = null;
private void OnEnable()
{
_collider.Clear();
var sceneRoot = GameObject.Find("SceneRoot");
if (sceneRoot == null)
{
UnityEngine.Debug.LogError("场景错误找不到SceneRoot节点");
return;
}
var meshs = sceneRoot.GetComponentsInChildren<MeshFilter>();
for (int i = 0; i < meshs.Length; ++i)
{
if (meshs[i].gameObject.layer == LayerUtils.TerrainMesh || meshs[i].gameObject.layer == LayerUtils.Terrain)
{
var col = meshs[i].gameObject.AddComponent<MeshCollider>();
_collider.Add(col);
}
}
var filePath = FileUtils.MapInfoDirPath + '/' + SceneManager.GetActiveScene().name + "_PathGrid.bytes";
if (File.Exists(filePath))
{
_gridData = new PathGirdData();
UnityEngine.Gonbest.MagicCube.FFileReader.ReadBytesAsync(filePath, bytes => {
if (bytes != null)
{
_gridData.Load(bytes);
}
});
}
else
{
_gridData = null;
}
if (_cameraGo != null && _cameraGo.name != "[Cameras]")
{
GameObject.DestroyImmediate(_cameraGo);
_cameraGo = null;
}
var preCamera = sceneRoot.transform.Find("[Cameras]");
if (preCamera != null)
{
_cameraGo = preCamera.gameObject;
}
else
{
_cameraGo = new GameObject("CameraRoot");
var camera = _cameraGo.RequireComponent<Camera>();
camera.cullingMask = ~LayerUtils.UI_Mask;
camera.clearFlags = CameraClearFlags.Skybox;
}
_cameraCol = new PreviewSceneCamera();
_cameraCol.TransformInst = _cameraGo.transform;
var res = Resources.Load("Prefab/Player/player_0/player_001");
_playerGo = GameObject.Instantiate(res) as GameObject;
var anim = UnityUtils.RequireComponent<AnimListBaseScript>(_playerGo);
anim.AddClips(AnimInfo.GetClips(anim.AnimAssetPathDic.Values));
_playerAnim = new AnimationPlayer(anim);
_syncTime = Time.realtimeSinceStartup;
_playerGo.transform.position = Vector3.zero;
_cameraCol.TargetTrans = _playerGo.transform;
}
private void OnDestroy()
{
for (int i = 0; i < _collider.Count; ++i)
{
GameObject.DestroyImmediate(_collider[i]);
}
_collider.Clear();
if (_cameraGo != null && _cameraGo.name != "[Cameras]")
{
GameObject.DestroyImmediate(_cameraGo);
_cameraGo = null;
}
_cameraCol = null;
_gridData = null;
}
private void Update()
{
if (!Application.isPlaying)
{
Close();
return;
}
var dt = Time.realtimeSinceStartup - _syncTime;
_syncTime = Time.realtimeSinceStartup;
if (_cameraCol != null)
{
_cameraCol.Update();
}
if (_playerAnim != null)
{
_playerAnim.Update(dt);
}
var playerPos = _playerGo.transform.position;
if (_isMoving)
{
playerPos += _moveDir * 10f * dt;
_playerGo.transform.forward = _moveDir;
if (!_playerAnim.IsPlaying)
{
_playerAnim.Play(AnimClipNameDefine.NormalRun, AnimationPartType.AllBody, WrapMode.Loop);
}
}
else
{
if (!_playerAnim.IsPlaying)
{
_playerAnim.Play(AnimClipNameDefine.NormalIdle, AnimationPartType.AllBody, WrapMode.Loop);
}
}
if (_useGirdData && _gridData != null)
{
playerPos.y = _gridData.GetHeight(playerPos.x, playerPos.z);
}
else
{
_hitRay.origin = new Vector3(playerPos.x, 1000f, playerPos.z);
_hitRay.direction = Vector3.down;
RaycastHit hitInfo;
if (Physics.Raycast(_hitRay, out hitInfo, 1000f, LayerUtils.Terrain_Mask))
{
playerPos.y = hitInfo.point.y;
}
else
{
playerPos.y = 0f;
}
}
_playerGo.transform.position = playerPos;
}
private void OnGUI()
{
switch (Event.current.type)
{
case EventType.KeyDown:
{
if (Event.current.keyCode == KeyCode.W)
{
wDown = true;
Event.current.Use();
}
if (Event.current.keyCode == KeyCode.S)
{
sDown = true;
Event.current.Use();
}
if (Event.current.keyCode == KeyCode.A)
{
aDown = true;
Event.current.Use();
}
if (Event.current.keyCode == KeyCode.D)
{
dDown = true;
Event.current.Use();
}
}
break;
case EventType.KeyUp:
{
if (Event.current.keyCode == KeyCode.W)
{
wDown = false;
Event.current.Use();
}
if (Event.current.keyCode == KeyCode.S)
{
sDown = false;
Event.current.Use();
}
if (Event.current.keyCode == KeyCode.A)
{
aDown = false;
Event.current.Use();
}
if (Event.current.keyCode == KeyCode.D)
{
dDown = false;
Event.current.Use();
}
}
break;
}
if (wDown || sDown || aDown || dDown)
{
var frontDir = _playerGo.transform.position - _cameraGo.transform.position;
frontDir.y = 0;
frontDir = frontDir.normalized;
float angle = 0f;
if (wDown && aDown)
{
angle = -45f;
}
else if (wDown && dDown)
{
angle = 45f;
}
else if (sDown && aDown)
{
angle = -135f;
}
else if (sDown && dDown)
{
angle = 135f;
}
else if (wDown)
{
angle = 0f;
}
else if (sDown)
{
angle = 180f;
}
else if (aDown)
{
angle = -90f;
}
else if (dDown)
{
angle = 90f;
}
_moveDir = (Quaternion.AngleAxis(angle, Vector3.up) * frontDir).normalized;
if (!_isMoving)
{
_isMoving = true;
_playerAnim.Play(AnimClipNameDefine.NormalRun, AnimationPartType.AllBody, WrapMode.Loop);
}
}
else
{
if (_isMoving)
{
_playerAnim.Play(AnimClipNameDefine.NormalIdle, AnimationPartType.AllBody, WrapMode.Loop);
_isMoving = false;
}
}
if (_cameraCol != null)
{
EditorGUILayout.BeginHorizontal();
_cameraCol.CurPitch = EditorGUILayout.FloatField("CurPitch", _cameraCol.CurPitch);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
_cameraCol.CurYaw = EditorGUILayout.FloatField("CurYaw", _cameraCol.CurYaw);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
_cameraCol.CurDis = EditorGUILayout.FloatField("CurDis", _cameraCol.CurDis);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
_cameraCol.CurOffsetY = EditorGUILayout.FloatField("CurOffsetY", _cameraCol.CurOffsetY);
EditorGUILayout.EndHorizontal();
EditorGUILayout.BeginHorizontal();
_cameraCol.CurOffsetX = EditorGUILayout.FloatField("CurOffsetX", _cameraCol.CurOffsetX);
EditorGUILayout.EndHorizontal();
if (_gridData != null)
{
EditorGUILayout.BeginHorizontal();
_useGirdData = EditorGUILayout.Toggle("使用高度数据", _useGirdData);
EditorGUILayout.EndHorizontal();
}
}
}
}