经典游戏案例: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

相关文章

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

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.函数返回的