该项目的目的是同时测试和演示来自 Unity DOTS 技术堆栈的多个新包。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 
 

179 行
5.8 KiB

using System;
using System.Collections.Generic;
using Unity.Entities;
using Unity.Jobs;
using Unity.Sample.Core;
using UnityEngine;
public class ClientFrontend : MonoBehaviour
{
public ScoreBoard scoreboardPanel;
public GameScore gameScorePanel;
public ChatPanel chatPanel;
public ServerPanel serverPanel;
public bool m_ShowScorePanel;
#pragma warning disable 649
[SerializeField] CountDown countDownPanel;
[SerializeField] MainMenu mainMenu;
[SerializeField] SoundDef uiHighlightSound;
[SerializeField] SoundDef uiSelectSound;
[SerializeField] SoundDef uiSelectLightSound;
[SerializeField] SoundDef uiCloseSound;
#pragma warning restore 649
Canvas m_ScoreboardPanelCanvas;
Canvas m_GameScorePanelCanvas;
Canvas m_CountDownPanelCanvas;
Canvas m_ChatPanelCanvas;
public enum MenuShowing
{
None,
Main,
Ingame
}
Interpolator m_MenuFader = new Interpolator(0.0f, Interpolator.CurveType.SmoothStep);
public MenuShowing menuShowing { get; private set; } = MenuShowing.None;
public int ActiveMainMenuNumber
{
get { return mainMenu.gameObject.activeSelf ? mainMenu.activeSubmenuNumber : -1; }
}
// Audio for menus. Called from events on the ui elements
public void OnHighlight() { SoundSystem.Instance.Play(uiHighlightSound); }
public void OnSelect() { SoundSystem.Instance.Play(uiSelectSound); }
public void OnClose() { SoundSystem.Instance.Play(uiCloseSound); }
void Awake()
{
m_ScoreboardPanelCanvas = scoreboardPanel.GetComponent<Canvas>();
m_GameScorePanelCanvas = gameScorePanel.GetComponent<Canvas>();
m_CountDownPanelCanvas = countDownPanel.GetComponent<Canvas>();
m_ChatPanelCanvas = chatPanel.GetComponent<Canvas>();
Clear();
}
public void Clear()
{
scoreboardPanel.SetPanelActive(false);
gameScorePanel.SetPanelActive(false);
countDownPanel.SetPanelActive(false);
mainMenu.SetPanelActive(MenuShowing.None);
chatPanel.SetPanelActive(true); // active always as it has its own display/hide logic
chatPanel.ClearMessages();
serverPanel.SetPanelActive(false);
}
public void ShowMenu(MenuShowing show, float fadeTime = 0.0f)
{
if (menuShowing == show)
return;
menuShowing = show;
m_MenuFader.MoveTo(show != MenuShowing.None ? 1.0f : 0.0f, fadeTime);
if (menuShowing != MenuShowing.None)
SoundSystem.Instance.Play(uiSelectLightSound);
else
SoundSystem.Instance.Play(uiCloseSound);
}
public void UpdateGame()
{
mainMenu.UpdateMenus();
// Show/Hide fully for debug purposes
var show = IngameHUD.showHud.IntValue > 0;
if (m_ChatPanelCanvas.enabled != show)
{
m_ScoreboardPanelCanvas.enabled = show;
m_GameScorePanelCanvas.enabled = show;
m_CountDownPanelCanvas.enabled = show;
m_ChatPanelCanvas.enabled = show;
}
// Toggle menu if not in editor
if (!Application.isEditor && Input.GetKeyUp(KeyCode.Escape))
{
if (menuShowing == MenuShowing.None)
{
// What menu should we show?
// Show main menu if no level loaded or menu level loaded
if (Game.game.levelManager.currentLevel == null || Game.game.levelManager.currentLevel.name == "level_menu")
Console.EnqueueCommandNoHistory("menu 1 0.2");
else
Console.EnqueueCommandNoHistory("menu 2 0.2");
}
else
{
Console.EnqueueCommandNoHistory("menu 0 0.2");
InputSystem.RequestMousePointerLock();
}
}
// Fade main menu
var fade = m_MenuFader.GetValue();
var active = fade > 0.0f;
if (mainMenu.GetPanelActive() != active)
mainMenu.SetPanelActive(menuShowing);
if (active)
mainMenu.SetAlpha(fade);
}
public void UpdateChat(ChatSystemClient chatSystem)
{
chatPanel.Tick(chatSystem);
}
// Force showing of score board e.g. when dead
public void SetShowScorePanel(bool showScorePanel)
{
m_ShowScorePanel = showScorePanel;
}
public void UpdateIngame(ref Player.State playerState)
{
// Countdown
countDownPanel.SetPanelActive(playerState.displayCountDown);
if (playerState.displayCountDown)
countDownPanel.levelInfoCounter.Format("{0}", playerState.countDown);
// Scoreboard
scoreboardPanel.SetPanelActive(!playerState.displayCountDown && (playerState.displayScoreBoard || GatedInput.GetKey(KeyCode.Tab) || m_ShowScorePanel));
// Game score panel
gameScorePanel.SetPanelActive(playerState.displayGameScore);
}
}
[DisableAutoCreation]
[AlwaysSynchronizeSystem]
class ClientFrontendUpdate : JobComponentSystem
{
EntityQuery m_gameModeGroup;
EntityQuery m_localPlayerGroup;
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
int count = 0;
var PlayerStateFromEntity = GetComponentDataFromEntity<Player.State>(true);
Entities
.WithReadOnly(PlayerStateFromEntity)
.WithoutBurst() // Captures managed data
.ForEach((Entity entity, ref LocalPlayer localPlayer) =>
{
count++;
if(PlayerStateFromEntity.HasComponent(localPlayer.playerEntity))
{
var playerState = PlayerStateFromEntity[localPlayer.playerEntity];
Game.game.clientFrontend.UpdateIngame(ref playerState);
}
}).Run();
GameDebug.Assert(count == 1, "There should only be one localplayer. Found:{0}", count);
return default;
}
}