这是第一个 Unity 开放项目的repo,是 Unity 和社区合作创建的一个小型开源游戏演示,第一款游戏是一款名为 Chop Chop 的动作冒险游戏。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
 
 
 

93 行
2.2 KiB

using System.Collections.Generic;
using UnityEngine;
public enum GameState
{
Gameplay, //regular state: player moves, attacks, can perform actions
Pause, //pause menu is opened, the whole game world is frozen
Inventory, //when inventory UI or cooking UI are open
Dialogue,
Cutscene,
LocationTransition, //when the character steps into LocationExit trigger, fade to black begins and control is removed from the player
Combat, //enemy is nearby and alert, player can't open Inventory or initiate dialogues, but can pause the game
}
//[CreateAssetMenu(fileName = "GameState", menuName = "Gameplay/GameState", order = 51)]
public class GameStateSO : DescriptionBaseSO
{
public GameState CurrentGameState => _currentGameState;
[Header("Game states")]
[SerializeField][ReadOnly] private GameState _currentGameState = default;
[SerializeField][ReadOnly] private GameState _previousGameState = default;
[Header("Broadcasting on")]
[SerializeField] private BoolEventChannelSO _onCombatStateEvent = default;
private List<Transform> _alertEnemies;
private void Start()
{
_alertEnemies = new List<Transform>();
}
public void AddAlertEnemy(Transform enemy)
{
if (!_alertEnemies.Contains(enemy))
{
_alertEnemies.Add(enemy);
}
UpdateGameState(GameState.Combat);
}
public void RemoveAlertEnemy(Transform enemy)
{
if (_alertEnemies.Contains(enemy))
{
_alertEnemies.Remove(enemy);
if (_alertEnemies.Count == 0)
{
UpdateGameState(GameState.Gameplay);
}
}
}
public void UpdateGameState(GameState newGameState)
{
if (newGameState == CurrentGameState)
return;
if (newGameState == GameState.Combat)
{
_onCombatStateEvent.RaiseEvent(true);
}
else
{
_onCombatStateEvent.RaiseEvent(false);
}
_previousGameState = _currentGameState;
_currentGameState = newGameState;
}
public void ResetToPreviousGameState()
{
if (_previousGameState == _currentGameState)
return;
if (_previousGameState == GameState.Combat)
{
_onCombatStateEvent.RaiseEvent(false);
}
else if (_currentGameState == GameState.Combat)
{
_onCombatStateEvent.RaiseEvent(true);
}
GameState stateToReturnTo = _previousGameState;
_previousGameState = _currentGameState;
_currentGameState = stateToReturnTo;
}
}