feat(Edit): 现在玩家按E可以直接对可编辑物体进行编辑
This commit is contained in:
@@ -1,10 +1,8 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Core;
|
||||
using Script.Gameplay.Interface;
|
||||
using Script.Gameplay.Player;
|
||||
using Script.Gameplay.Facility;
|
||||
using UnityEngine;
|
||||
using Script.Gameplay.Input;
|
||||
|
||||
@@ -13,36 +11,28 @@ namespace UI
|
||||
// 用于显示和编辑 Facility 上的各个 IEditComponent 组件的 UI 面板
|
||||
public class PlayerEditViewer : UIBase
|
||||
{
|
||||
private PlayerEditController controller;
|
||||
private PlayerWatchModeController watchModeController;
|
||||
private IEditable editable;
|
||||
private List<IEditableComponent> components = new List<IEditableComponent>();
|
||||
private List<EditableComponentViewer> componentViewers = new List<EditableComponentViewer>();
|
||||
[SerializeField] private GameObject componentEditViewerPrefab;
|
||||
[SerializeField] private GameObject noEditableTargetPanel;
|
||||
[SerializeField] private float panelRadius = 100f;
|
||||
|
||||
public List<EditableComponentViewer> componentViewers = new List<EditableComponentViewer>();
|
||||
private PlayerEditController editController;
|
||||
private InputManager inputManager;
|
||||
|
||||
private void Awake()
|
||||
|
||||
protected override void Awake()
|
||||
{
|
||||
base.Awake();
|
||||
inputManager = InputManager.Instance;
|
||||
ControllerLocator.Instance.TryGetWait<PlayerEditController>(GetPlayerEditControllerHandle);
|
||||
ControllerLocator.Instance.TryGetWait<PlayerWatchModeController>(GetPlayerWatchModeControllerHandle);
|
||||
ControllerLocator.Instance.TryGetWait<PlayerEditController>(OnGetPlayerEditController);
|
||||
}
|
||||
|
||||
private void Start()
|
||||
{
|
||||
}
|
||||
|
||||
public void OnEnterInsideWatchMode()
|
||||
public void OnBeginEdit(IEditable target)
|
||||
{
|
||||
this.gameObject.SetActive(true);
|
||||
if (GetEditableFromController() != null)
|
||||
if (target != null)
|
||||
{
|
||||
GetEditableComponentsFromEditable();
|
||||
ClearComponentUI();
|
||||
GenerateComponentUI();
|
||||
GenerateComponentUI(GetEditableComponentsFromEditable(target));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -53,7 +43,7 @@ namespace UI
|
||||
}
|
||||
}
|
||||
|
||||
public void OnExitInsideWatchMode()
|
||||
public void OnEndEdit(IEditable target)
|
||||
{
|
||||
this.gameObject.SetActive(false);
|
||||
|
||||
@@ -65,50 +55,23 @@ namespace UI
|
||||
}
|
||||
|
||||
// 获取 PlayerEditController 的回调
|
||||
private void GetPlayerEditControllerHandle(PlayerEditController editController)
|
||||
private void OnGetPlayerEditController(PlayerEditController controller)
|
||||
{
|
||||
controller = editController;
|
||||
this.editController = controller;
|
||||
this.editController.OnBeginEditTarget += OnBeginEdit;
|
||||
this.editController.OnEndEditTarget += OnEndEdit;
|
||||
//Debug.Log("PlayerEditViewer obtained PlayerEditController.");
|
||||
}
|
||||
|
||||
// 获取 PlayerWatchModeController 的回调
|
||||
private void GetPlayerWatchModeControllerHandle(PlayerWatchModeController watchModeCtrl)
|
||||
|
||||
private List<IEditableComponent> GetEditableComponentsFromEditable(IEditable target)
|
||||
{
|
||||
watchModeController = watchModeCtrl;
|
||||
watchModeController.OnEnterWatchMode += (WatchMode mode) =>
|
||||
if (target == null)
|
||||
{
|
||||
if (mode == WatchMode.Inside)
|
||||
OnEnterInsideWatchMode();
|
||||
};
|
||||
watchModeController.OnExitWatchMode += (WatchMode mode) =>
|
||||
{
|
||||
if (mode == WatchMode.Inside)
|
||||
OnExitInsideWatchMode();
|
||||
};
|
||||
|
||||
//Debug.Log("PlayerEditViewer subscribed to WatchMode events.");
|
||||
}
|
||||
|
||||
private IEditable GetEditableFromController()
|
||||
{
|
||||
if (controller == null)
|
||||
{
|
||||
Debug.Log($"controller is null in {nameof(PlayerEditViewer)}");
|
||||
Debug.Log($"editable is null in {nameof(PlayerEditViewer)}");
|
||||
return null;
|
||||
}
|
||||
|
||||
return editable = controller.GetCurrentTarget();
|
||||
}
|
||||
|
||||
private void GetEditableComponentsFromEditable()
|
||||
{
|
||||
if (editable == null)
|
||||
{
|
||||
Debug.Log($"editable is null in {nameof(PlayerEditViewer)}");
|
||||
return;
|
||||
}
|
||||
|
||||
components = editable.GetEditableComponents()
|
||||
return target.GetEditableComponents()
|
||||
.Where(c => c != null)
|
||||
.ToList();
|
||||
}
|
||||
@@ -128,7 +91,7 @@ namespace UI
|
||||
}
|
||||
|
||||
// 根据 components 生成 UI, 根据拥有的 IEditComponent 的数量动态生成 UI 元素。布局为环绕着面板中心排列(自适应间隔)。
|
||||
private void GenerateComponentUI()
|
||||
private void GenerateComponentUI(List<IEditableComponent> components)
|
||||
{
|
||||
if (components == null || components.Count == 0 || componentEditViewerPrefab == null) return;
|
||||
|
||||
|
Reference in New Issue
Block a user