NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Gameplay/UI/UI_ChoosePersonController.cs

200 lines
5.6 KiB
C#

using Code.Scripts.Gameplay.Game;
using Cysharp.Threading.Tasks;
using Gameplay;
using Gameplay.Net;
using Gameplay.Story;
using Gameplay.Utils;
using PhxhSDK;
using UnityEngine;
using UnityEngine.UI;
using Object = UnityEngine.Object;
/// <summary>
/// 选人UI
/// </summary>
public class UI_ChoosePersonController : UIWindow
{
/// <summary>
/// 打开选人界面
/// </summary>
/// <returns></returns>
public static async UniTask<UIWindow> Open()
{
await CommonUtils.CaptureScreenshot(); // 截取当前屏幕截图
return await UIManager.Instance.CreateAndOpenWindow(UINameConst.UI_ChoosePerson);
}
#region UI
/// <summary>
/// 高斯模糊遮罩
/// </summary>
private RawImage rawImageGaussianBlurMask;
/// <summary>
/// 形象1按钮
/// </summary>
private Button buttonModel1;
/// <summary>
/// 形象2按钮
/// </summary>
private Button buttonModel2;
/// <summary>
/// 确定按钮
/// </summary>
private Button buttonConfirm;
/// <summary>
/// 选中状态1
/// </summary>
private GameObject goSelect1;
/// <summary>
/// 选中状态2
/// </summary>
private GameObject goSelect2;
#endregion
/// <summary>
/// 形象模型名1
/// </summary>
private const string MODEL_NAME_1 = "N00004";
/// <summary>
/// 形象模型名2
/// </summary>
private const string MODEL_NAME_2 = "N00005";
/// <summary>
/// 模型缩放
/// </summary>
private readonly Vector3 MODEL_SCALE = new(260f, 260f, 260f);
/// <summary>
/// 模型位置
/// </summary>
private readonly Vector3 MODEL_POS = new(0f, -185f, -200f);
/// <summary>
/// 模型旋转
/// </summary>
private readonly Quaternion MODEL_ROT = Quaternion.Euler(0f, 180f, 0f);
/// <summary>
/// 选择的模型id
/// </summary>
private int selectModelId;
public override async void PreLoad(object data = null)
{
await AssetManager.Instance.PostPreload<GameObject>(PathEx.GetNpcDisplayModelPath(MODEL_NAME_1));
await AssetManager.Instance.PostPreload<GameObject>(PathEx.GetNpcDisplayModelPath(MODEL_NAME_2));
}
public override void OnInit()
{
rawImageGaussianBlurMask = GetComponent<RawImage>("GaussianBlurMask");
buttonModel1 = GetComponent<Button>("Image_BG/ButtonModel1");
buttonModel2 = GetComponent<Button>("Image_BG/ButtonModel2");
buttonConfirm = GetComponent<Button>("Image_BG/Button_Confirm");
goSelect1 = FindObj("Image_BG/ButtonModel1/ImageSelect");
goSelect2 = FindObj("Image_BG/ButtonModel2/ImageSelect");
rawImageGaussianBlurMask.texture = CommonUtils.GetScreenTexture2D();
selectModelId = 0;
OnModel(0);
goSelect1.gameObject.IsScaleShow(false);
goSelect2.gameObject.IsScaleShow(false);
BindButton(buttonModel1, () =>
{
OnModel(1);
goSelect1.gameObject.IsScaleShow(true);
goSelect2.gameObject.IsScaleShow(false);
});
BindButton(buttonModel2, () =>
{
OnModel(2);
goSelect1.gameObject.IsScaleShow(false);
goSelect2.gameObject.IsScaleShow(true);
});
BindButton(buttonConfirm, OnConfirm);
}
protected override async void OnShowWindow(object data = null)
{
base.OnShowWindow(data);
await AssetManager.Instance.WaitAllPreloads();
GameObject goModelTemp = AssetManager.Instance.GetPreLoadResult<GameObject>(PathEx.GetNpcDisplayModelPath(MODEL_NAME_1));
if (null != goModelTemp)
{
GameObject goModel = Object.Instantiate(goModelTemp, buttonModel1.transform, true);
goModel.transform.localPosition = MODEL_POS;
goModel.transform.localScale = MODEL_SCALE;
goModel.transform.localRotation = MODEL_ROT;
goModel.SetLayerEx(5);
}
goModelTemp = AssetManager.Instance.GetPreLoadResult<GameObject>(PathEx.GetNpcDisplayModelPath(MODEL_NAME_2));
if (null != goModelTemp)
{
GameObject goModel = Object.Instantiate(goModelTemp, buttonModel2.transform, true);
goModel.transform.localPosition = MODEL_POS;
goModel.transform.localScale = MODEL_SCALE;
goModel.transform.localRotation = MODEL_ROT;
goModel.SetLayerEx(5);
}
}
protected override void OnHideWindow()
{
base.OnHideWindow();
}
public override void OnRelease()
{
AssetManager.Instance.Unload(PathEx.GetNpcDisplayModelPath(MODEL_NAME_1));
AssetManager.Instance.Unload(PathEx.GetNpcDisplayModelPath(MODEL_NAME_2));
base.OnRelease();
}
#region 回调方法
/// <summary>
/// 关闭
/// </summary>
private void OnClose()
{
CloseWindow();
}
/// <summary>
/// 选择模型
/// </summary>
/// <param name="i"></param>
private void OnModel(int id)
{
selectModelId = id;
buttonConfirm.interactable = 0 != selectModelId;
}
/// <summary>
/// 确定选择
/// </summary>
private void OnConfirm()
{
NetHelper.SetPlayeHead((uint)selectModelId);
_ContinueStory();
}
private async void _ContinueStory()
{
if (GameStateManager.Instance.GetCurState() is GameStateStory gameStateStory)
{
// 这里需要重新创建主角模型
await StoryManager.instance.AutoReCreatePlayerModel(gameStateStory.storyConfig);
gameStateStory.IsReady = true;
}
OnClose();
}
#endregion
}