游戏中的“状态机”和“行为树”是什么?

67a1915da403d7125fb798364d517993.jpeg

状态机是一种模型,用于描述对象在不同状态下的行为和转换。在游戏里,状态机通常用于控制角色或NPC在不同状态下的行为。比如说,一个角色可以有多个状态,比如“待机”、“行走”、“攻击”、“受伤”等,每个状态对应不同的行为和动画。状态之间可以通过条件或事件进行转换,比如说,当角色受到攻击时,就会从“待机”状态转换到“受伤”状态。

用状态机可以让游戏逻辑更清晰、更好管理,还能方便地扩展或修改角色的行为。状态机的优点有:

  • 容易扩展和修改:不同的状态和转换可以随时添加或修改。
  • 逻辑简单:状态机可以让游戏逻辑更清晰、更好管理。
  • 方便调试:状态机可以方便地调试和查找问题。

不过,状态机的缺点也有:

  • 状态之间的转换可能会变得复杂。
  • 对于复杂的游戏逻辑,可能需要设计多个状态机。

游戏管理器中使用状态机的示例:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class GameManager : MonoBehaviour
{
// 状态枚举
public enum GameState
{
Start,
Playing,
Paused,
GameOver
}

// 当前状态
private GameState currentState;

// 状态机
private Dictionary<GameState, System.Action> stateMachine = new Dictionary<GameState, System.Action>();

// 初始化状态机
private void InitStateMachine()
{
stateMachine[GameState.Start] = OnStart;
stateMachine[GameState.Playing] = OnPlaying;
stateMachine[GameState.Paused] = OnPaused;
stateMachine[GameState.GameOver] = OnGameOver;
}

// 进入下一个状态
private void ChangeState(GameState nextState)
{
if (stateMachine.ContainsKey(nextState))
{
currentState = nextState;
}
else
{
Debug.LogError("Invalid state: " + nextState);
}
}

// Start状态
private void OnStart()
{
Debug.Log("Game start");
ChangeState(GameState.Playing);
}

// Playing状态
private void OnPlaying()
{
Debug.Log("Game playing");

if (Input.GetKeyDown(KeyCode.Escape))
{
ChangeState(GameState.Paused);
}
else if (GameOverCondition())
{
ChangeState(GameState.GameOver);
}
}

// Paused状态
private void OnPaused()
{
Debug.Log("Game paused");

if (Input.GetKeyDown(KeyCode.Escape))
{
ChangeState(GameState.Playing);
}
}

// GameOver状态
private void OnGameOver()
{
Debug.Log("Game over");
}

// 检查游戏结束条件
private bool GameOverCondition()
{
// TODO: 检查游戏结束条件
return false;
}

// 初始化
private void Start()
{
InitStateMachine();
ChangeState(GameState.Start);
}

// 更新
private void Update()
{
if (stateMachine.ContainsKey(currentState))
{
stateMachine[currentState].Invoke();
}
else
{
Debug.LogError("Invalid state: " + currentState);
}
}
}

这里我们用状态机来控制游戏啦!状态机包含四个状态:开始、游戏中、暂停和游戏结束。我们的游戏管理器会把每个状态对应的方法存储在一个字典里,然后根据当前状态调用对应的方法。在每个状态的方法里,我们可以执行相应的逻辑,例如开始游戏、暂停游戏、检查游戏结束条件等等。当我们需要切换状态时,我们可以调用ChangeState方法来进入下一个状态。

这是一个简单的状态机实现示例,我们可以根据实际情况进行修改和扩展,以满足游戏的需求。在实际开发中,使用状态机可以帮助我们更好地组织代码和控制游戏逻辑,从而提高游戏开发效率和质量。

猜你喜欢

转载自blog.csdn.net/shguxudong11/article/details/129282252