经典游戏案例:unity官方推荐3d跑酷

2024-06-19 15:52

本文主要是介绍经典游戏案例:unity官方推荐3d跑酷,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

学习目标:实现跑酷核心算法

游戏画面

项目结构目录

部分核心代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 游戏管理器是一个状态机,根据当前的游戏状态,它将在状态之间切换。
/// </summary>
public class GameManager : MonoBehaviour
{/// <summary>/// 单例模式/// </summary>public static GameManager instance { get { return s_Instance; } }protected static GameManager s_Instance;public AState[] states;//返回栈顶的游戏状态public AState topState { get { if (m_StateStack.Count == 0) return null; return m_StateStack[m_StateStack.Count - 1]; } }//消耗品数据库public ConsumableDatabase m_consumableDatabase;//游戏状态栈protected List<AState> m_StateStack = new List<AState>();//游戏状态字典protected Dictionary<string, AState> m_StateDict = new Dictionary<string, AState>();//函数执行顺序:awake onenable startprotected void OnEnable(){PlayerData.Create();s_Instance = this;m_consumableDatabase.Load();m_StateDict.Clear();if (states.Length == 0){return;}//初始化游戏状态字典for (int i = 0; i < states.Length; ++i){states[i].manager = this;m_StateDict.Add(states[i].GetName(), states[i]);}m_StateStack.Clear();PushState(states[0].GetName());}protected void Update(){if (m_StateStack.Count > 0){m_StateStack[m_StateStack.Count - 1].Tick();}}#region 游戏状态管理/// <summary>/// 游戏状态间的切换/// </summary>/// <param name="newState"></param>public void SwitchState(string newState){AState state = FindState(newState);if(state == null){Debug.LogError("Can't find the state named " + newState);return;}m_StateStack[m_StateStack.Count - 1].Exit(state);state.Enter(m_StateStack[m_StateStack.Count - 1]);m_StateStack.RemoveAt(m_StateStack.Count - 1);m_StateStack.Add(state);}/// <summary>/// 返回上一步游戏状态,并移除栈顶游戏状态/// </summary>public void PopState(){if (m_StateStack.Count < 2){Debug.LogError("Can't pop states, only one in stack.");return;}m_StateStack[m_StateStack.Count - 1].Exit(m_StateStack[m_StateStack.Count - 2]);m_StateStack[m_StateStack.Count - 2].Enter(m_StateStack[m_StateStack.Count - 2]);m_StateStack.RemoveAt(m_StateStack.Count - 1);}/// <summary>/// 进入新的游戏状态,并将其入栈/// </summary>/// <param name="name"></param>public void PushState(string name){AState state;if(!m_StateDict.TryGetValue(name,out state)){Debug.LogError("Can't find the state named " + name);return;}if (m_StateStack.Count > 0){m_StateStack[m_StateStack.Count - 1].Exit(state);state.Enter(m_StateStack[m_StateStack.Count - 1]);}else{state.Enter(null);}m_StateStack.Add(state);}/// <summary>/// 在字典中查找游戏状态/// </summary>/// <param name="statename"></param>/// <returns></returns>public AState FindState(string statename){AState state;if (!m_StateDict.TryGetValue(statename, out state)){return null;}else{return state;}}#endregion
}
/// <summary>
/// 游戏状态,用栈结构来存放
/// </summary>
public abstract class AState:MonoBehaviour
{[HideInInspector]public GameManager manager;/// <summary>/// 进入目标游戏状态前要执行的操作/// </summary>/// <param name="from">从哪个状态进入</param>public abstract void Enter(AState from);/// <summary>/// 离开目标游戏状态后要执行的操作/// </summary>/// <param name="to"></param>public abstract void Exit(AState to);/// <summary>/// 在目标游戏状态中要执行的操作/// </summary>public abstract void Tick();/// <summary>/// 获取游戏状态名(返回字符串)/// </summary>/// <returns></returns>public abstract string GetName();
}

下载链接:https://gitee.com/unity_demo/carzy-dash

这篇关于经典游戏案例:unity官方推荐3d跑酷的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075468

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Python中re模块结合正则表达式的实际应用案例

《Python中re模块结合正则表达式的实际应用案例》Python中的re模块是用于处理正则表达式的强大工具,正则表达式是一种用来匹配字符串的模式,它可以在文本中搜索和匹配特定的字符串模式,这篇文章主... 目录前言re模块常用函数一、查看文本中是否包含 A 或 B 字符串二、替换多个关键词为统一格式三、提

Go语言中nil判断的注意事项(最新推荐)

《Go语言中nil判断的注意事项(最新推荐)》本文给大家介绍Go语言中nil判断的注意事项,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1.接口变量的特殊行为2.nil的合法类型3.nil值的实用行为4.自定义类型与nil5.反射判断nil6.函数返回的

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数