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

163 行
6.9 KiB

using System.Collections.Generic;
using Unity.Collections;
using UnityEngine;
using Unity.Entities;
using Unity.Jobs;
using Unity.Sample.Core;
using UnityEngine.UI;
[DisableAutoCreation]
[AlwaysSynchronizeSystem]
public class GameModeSystemClient : JobComponentSystem
{
EntityQuery PlayersGroup;
EntityQuery GameModesGroup;
int m_PlayerId;
Entity m_Player;
public GameModeSystemClient()
{
if (Game.game.clientFrontend != null)
{
Game.game.clientFrontend.scoreboardPanel.uiBinding.Clear(); ;
Game.game.clientFrontend.gameScorePanel.Clear();
}
}
protected override void OnCreate()
{
base.OnCreate();
PlayersGroup = GetEntityQuery(typeof(Player.State));
GameModesGroup = GetEntityQuery(typeof(GameModeData));
}
public void Shutdown()
{
if (Game.game.clientFrontend != null)
{
Game.game.clientFrontend.scoreboardPanel.uiBinding.Clear(); ;
Game.game.clientFrontend.gameScorePanel.Clear();
}
}
// TODO : We need to fix up these dependencies
public void SetLocalPlayerId(int playerId)
{
m_PlayerId = playerId;
}
protected override JobHandle OnUpdate(JobHandle inputDeps)
{
if (Game.game.clientFrontend == null)
return default;
var scoreboardUI = Game.game.clientFrontend.scoreboardPanel.uiBinding;
var overlayUI = Game.game.clientFrontend.gameScorePanel;
using (var playerEntityArray = PlayersGroup.ToEntityArray(Allocator.Persistent))
using (var playerStateArray = PlayersGroup.ToComponentDataArray<Player.State>(Allocator.Persistent))
using (var gameModeArray = GameModesGroup.ToComponentDataArray<GameModeData>(Allocator.Persistent))
{
// Update individual player stats
// Use these indexes to fill up each of the team lists
var scoreBoardPlayerIndexes = new int[scoreboardUI.teams.Length];
for (int i = 0, c = playerStateArray.Length; i < c; ++i)
{
var playerEntity = playerEntityArray[i];
var playerState = playerStateArray[i];
var teamIndex = playerState.teamIndex;
// TODO (petera) this feels kind of hacky
if (playerState.playerId == m_PlayerId)
m_Player = playerEntity;
var teamColor = Color.white;
int scoreBoardColumn = 0;
if (m_Player != Entity.Null)
{
var ps = EntityManager.GetComponentData<Player.State>(m_Player);
bool friendly = teamIndex == ps.teamIndex;
teamColor = friendly ? Game.game.gameColors[(int)Game.GameColor.Friend] : Game.game.gameColors[(int)Game.GameColor.Enemy];
scoreBoardColumn = friendly ? 0 : 1;
}
var idx = scoreBoardPlayerIndexes[scoreBoardColumn]++;
var column = scoreboardUI.teams[scoreBoardColumn];
// If too few,
while (idx >= column.playerScores.Count)
{
var entry = GameObject.Instantiate<TMPro.TextMeshProUGUI>(column.playerScoreTemplate, column.playerScoreTemplate.transform.parent);
entry.gameObject.SetActive(true);
var trans = (RectTransform)entry.transform;
var tempTrans = ((RectTransform)column.playerScoreTemplate.transform);
trans.localPosition = tempTrans.localPosition - new Vector3(0, tempTrans.rect.height * idx, 0);
column.playerScores.Add(entry);
}
column.playerScores[idx].Format("{0} : {1}", playerState.playerName.ToString(), playerState.score);
column.playerScores[idx].color = teamColor;
}
// Clear all member text fields that was not used
for (var teamIndex = 0; teamIndex < scoreboardUI.teams.Length; teamIndex++)
{
var numPlayers = scoreBoardPlayerIndexes[teamIndex];
var column = scoreboardUI.teams[teamIndex];
for (var i = column.playerScores.Count - 1; i >= numPlayers; --i)
{
GameObject.Destroy(column.playerScores[i].gameObject);
column.playerScores.RemoveAt(i);
}
}
if (m_Player == Entity.Null)
return default;
var localPlayerState = EntityManager.GetComponentData<Player.State>(m_Player);
// Update gamemode overlay
GameDebug.Assert(gameModeArray.Length < 2);
if (gameModeArray.Length > 0)
{
GameModeData gameMode = gameModeArray[0];
if (localPlayerState.displayGameResult)
{
overlayUI.message.text = localPlayerState.gameResult.ToString();
}
else
overlayUI.message.text = "";
var timeLeft = System.TimeSpan.FromSeconds(gameMode.gameTimerSeconds);
overlayUI.timer.Format("{0}:{1:00}", timeLeft.Minutes, timeLeft.Seconds);
overlayUI.timerMessage.Set(ref gameMode.gameTimerMessage);
overlayUI.objective.Set(ref localPlayerState.goalString);
overlayUI.SetObjectiveProgress(localPlayerState.goalCompletion, (int)localPlayerState.goalAttackers, (int)localPlayerState.goalDefenders, Game.game.gameColors[localPlayerState.goalDefendersColor], Game.game.gameColors[localPlayerState.goalAttackersColor]);
// Update team scores on hud
var friendColor = Game.game.gameColors[(int)Game.GameColor.Friend];
var enemyColor = Game.game.gameColors[(int)Game.GameColor.Enemy];
overlayUI.team1Score.Format("{0}", localPlayerState.teamIndex == 0 ? gameMode.teamScore0 : gameMode.teamScore1);
overlayUI.team1Score.color = friendColor;
overlayUI.team2Score.Format("{0}", localPlayerState.teamIndex == 0 ? gameMode.teamScore1 : gameMode.teamScore0);
overlayUI.team2Score.color = enemyColor;
// Update team score and name on scoreboard
scoreboardUI.teams[0].score.Format("{0}", localPlayerState.teamIndex == 0 ? gameMode.teamScore0 : gameMode.teamScore1);
scoreboardUI.teams[1].score.Format("{0}", localPlayerState.teamIndex == 0 ? gameMode.teamScore1 : gameMode.teamScore0);
scoreboardUI.teams[0].name.Set(ref (localPlayerState.teamIndex == 0 ? ref gameMode.teamName0 : ref gameMode.teamName1));
scoreboardUI.teams[1].name.Set(ref (localPlayerState.teamIndex == 0 ? ref gameMode.teamName1 : ref gameMode.teamName0));
}
overlayUI.action.text = localPlayerState.actionString.ToString();
}
return default;
}
}