经典游戏案例: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 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

Java Stream.reduce()方法操作实际案例讲解

《JavaStream.reduce()方法操作实际案例讲解》reduce是JavaStreamAPI中的一个核心操作,用于将流中的元素组合起来产生单个结果,:本文主要介绍JavaStream.... 目录一、reduce的基本概念1. 什么是reduce操作2. reduce方法的三种形式二、reduce

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

Spring Boot 整合 Redis 实现数据缓存案例详解

《SpringBoot整合Redis实现数据缓存案例详解》Springboot缓存,默认使用的是ConcurrentMap的方式来实现的,然而我们在项目中并不会这么使用,本文介绍SpringB... 目录1.添加 Maven 依赖2.配置Redis属性3.创建 redisCacheManager4.使用Sp

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例

《Nginx使用Keepalived部署web集群(高可用高性能负载均衡)实战案例》本文介绍Nginx+Keepalived实现Web集群高可用负载均衡的部署与测试,涵盖架构设计、环境配置、健康检查、... 目录前言一、架构设计二、环境准备三、案例部署配置 前端 Keepalived配置 前端 Nginx

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ