【服务器08】之【游戏框架】之【加载主角】

news2024/9/20 15:59:38

首先简单了解一下帧率

FixedUpdate( )   >   Update( )   >   LateUpdate( )

首先FixedUpdate的设置值 默认一秒运行50次

虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有多数物体都进行物理更新时,FixedUpdate的调用也会慢下来。

我们继续编写代码:

首先添加两个函数

接下来我们写一个管理器代码,用来增添删除 这个游戏中运行中的Object

创建一个代码WorldManager.cs 用来在这个脚本中创建 树、房子、人物等等对象

编写代码:

重写以下代码框架:

运行测试加载场景

下一步开始加载主角

在Unity中新建一个目录

区别于创建Resources文件夹 ,Resources修改资源后又需打包才能运行,

而Res目录存放所有资源,我们可以单独打一个包,单独更新资源

拖拽资源

编写资源管理代码ResManager.cs

增添函数

编写WorldManager.cs脚本

修改代码:

using UnityEngine;
public class WorldManager : BaseManager<WorldManager>{
    //世界(场景)状态机
    enum LoadState {
        //初始化状态
        Init,
        //加载场景状态
        LoadScene,
        //更新状态
        Update,
        //等待状态
        Wait,
    }
    //需要变量保存一个当前状态
    LoadState mState;
    string mLoadSceneName;
    //初始化
    public void Init() {
        EnterState(LoadState.Init);
    }
    //世界更新
    public void Update() {
        if (mState == LoadState.Init) {
        
        }
        //"rpgpp_lt_scene_1.0"
        if (mState == LoadState.LoadScene) {
            EnterState(LoadState.Wait);
            ResManager.Instance.LoadSceneAsync(mLoadSceneName, () =>
            {
                //等待场景加载完成后 加载玩家到场景中
                LoadMainPlayer();

                //EnterState(LoadState.Update);
            });
        }
    }
    //世界管理中的加载场景
    public void LoadScene(string name) {
        mLoadSceneName = name;

        EnterState(LoadState.LoadScene);
    }
    //改变当前的状态机
    void EnterState(LoadState state) {
        mState = state;
    }

    //加载主角
    void LoadMainPlayer() {
        //ResManager.Instance.InstantiateGameObject("Assets/Res/Role/Peasant Nolant Blue(Free Version)");
        //- GameObject loadedObject = Resources.Load("Role/Peasant Nolant Blue(Free Version)") as GameObject;
        // GameObject instance = GameObject.Instantiate(loadedObject, new Vector3(0, 0, 0), Quaternion.identity);
        GameObject mainPlayer = ResManager.Instance.InstantiateGameObject("Assets/Res/Role/Peasant Nolant Blue(Free Version).prefab");
        if (mainPlayer == null)
        {
            Debug.LogError("Load Main Player Error");
        }

        mainPlayer.transform.position = new Vector3(63.0f, 22.23f, 43.0f);

        //mainPlayer.GetComponent<UnityEngine.Animator>().Play("metarig|Idle");
        mainPlayer.GetComponent<UnityEngine.Animator>().Play("metarig|Walk");
    }
}
修改ResManager.cs脚本

using UnityEngine;
using UnityEngine.SceneManagement;
//资源管理类 单例模式
public class ResManager : BaseManager<ResManager>{
    //枚举状态机
    enum LoadState {
        //空闲状态
        Idle,
        //加载状态
        LoadScene,
        //进度条状态
        TickLoadSceneProgress,
    }
    LoadState mCurrentLoadState = LoadState.Idle;
    string mCurrentSceneName = null;
    OnLoadCallBack SceneLoadedCallback;
    public delegate void OnLoadCallBack();
    AsyncOperation mCurrentSceneAsyncOperation;
    public void Update() {
        switch (mCurrentLoadState) {
            case LoadState.Idle:
                break;
            case LoadState.LoadScene:
                //通过回调的方式告诉我们 场景加载完成
                //场景切换之后才执行回调函数
                SceneManager.sceneLoaded += SceneManager_sceneLoaded;
                //异步加载核心语句******
                mCurrentSceneAsyncOperation = SceneManager.LoadSceneAsync(mCurrentSceneName, LoadSceneMode.Single);
                //                ******
                if (mCurrentSceneAsyncOperation == null){
                    Debug.LogError("Failed to load scene,mCurrentSceneAsynvOperation is null");
                    mCurrentLoadState  = LoadState.Idle;
                    return;
                }
                mCurrentLoadState = LoadState.TickLoadSceneProgress;
                break;
                //加载百分比此次没有调回至应用层
            case LoadState.TickLoadSceneProgress:
                Debug.Log("Loading scene " + mCurrentSceneName + " progress " + mCurrentSceneAsyncOperation.progress);
                break;
        }
    }
    //异步加载场景
    public void LoadSceneAsync(string name, OnLoadCallBack callback) {
        //判断当前是否正在加载场景
        if (mCurrentLoadState != LoadState.Idle) {
            Debug.LogError("On Scene is Loading, scene name " + name);
            return;
        }
        mCurrentLoadState = LoadState.LoadScene;
        mCurrentSceneName = name;
        SceneLoadedCallback = callback;
    }
    //已经淘汰了-本项目没有使用
    public void LoadScene(string name) {
        //同步加载场景
        SceneManager.LoadScene(name);
    }
    // unity 回调给我们的加载完成
    public void SceneManager_sceneLoaded(Scene scene, LoadSceneMode loadSceneMode) {
        //删掉委托
        SceneManager.sceneLoaded -= SceneManager_sceneLoaded;
        //证明场景加载完成
        mCurrentLoadState = LoadState.Idle;
        if (SceneLoadedCallback != null) {
            SceneLoadedCallback();
        }
    }
    //加载资源
    Object LoadResource(string resPath)
    {
#if UNITY_EDITOR
        //只能在unity 的 editor 下载资源的加载方式 只是从磁盘加载到内存中
        Object obj = UnityEditor.AssetDatabase.LoadAssetAtPath<Object>(resPath);
        return obj;
#else
        //
        其它的加载方式
#endif
    }

    //实例化显示一个资源-----包装LoadResource()加载资源函数 包装上面函数
    public GameObject InstantiateGameObject(string resPath)
    {
        //强转成GameObject
        GameObject obj = LoadResource(resPath) as GameObject;
        if (obj != null)
        {
            //实例化资源
            GameObject go = GameObject.Instantiate(obj);
            if (go == null)
            {
                Debug.LogError("game instantiate faild " + resPath);
                return null;
            }
            //激活资源
            go.SetActive(true);
            return go;
        }
        else
            return null;
    }
}
修改BaseManager.cs脚本

修改GameStart.cs脚本

using System;
using UnityEngine;
public class GameStart : MonoBehaviour{
    //在游戏运行期间始终保留的Object-切换场景时也不让删除
    GameObject mGo;
    void Start(){
        Debug.Log("Game Start");
        mGo = gameObject;
        //切换场景加载时不销毁
        DontDestroyOnLoad(mGo);
        //逻辑写到try里面
        try{
            //场景世界初始化
            WorldManager.Instance.Init();
        }
        //异常将它catch掉
        catch (Exception e) {
            Debug.LogException(e);
        }
        WorldManager.Instance.LoadScene("rpgpp_lt_scene_1.0");
    }
    //以固定频率更新
    void FixedUpdate(){

        try
        {
            
        }
        catch (Exception e)
        {
            Debug.LogException(e);
        }
    }
    //游戏循环
    void Update(){
        try{
            ResManager.Instance.Update();

            WorldManager.Instance.Update();
        }
        catch (Exception e) {
            Debug.LogException(e);
        }
    }
    //在Update() 后更新
    private void LateUpdate(){

        try{
            
        }
        catch (Exception e){
            Debug.LogException(e);
        }
    }
    //游戏退出时调用
    //作用是 退出游戏是销毁资源
    private void OnApplicationQuit(){
        Debug.Log("Game Quit");
        try{

        }
        catch (Exception e){
            Debug.LogException(e);
        }
    }
}
点击运行

人物运行成功

End.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1858424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式开发板屏幕显示汉字

一、实验目的 1&#xff0e;编写能够在嵌入式开发板LCD上显示汉字的程序&#xff1b; 2&#xff0e;在Ubuntu系统中编译上述程序生成可执行文件&#xff1b; 3&#xff0e;到开发板中验证。 二、实验步骤 1. Ubuntu系统上编写验证程序 Ubuntu系统上编写的验证程序如下&…

【亲测好用】神级PSAI插件大揭秘:三款创成式修图神器,让你解放双手

PsBeta被停用后&#xff0c;小编一直想找到能够平替PsBeta创成式填充功能的插件。 功夫不负有心&#xff0c;终于被我找到啦&#xff0c;现在就给大家揭秘这三款宝藏修图神器&#xff0c;希望能够帮到大家。 1.插件名称&#xff1a;Starai 无需科学上网&#xff0c;还自带提示…

文库小程序搭建部署:实现资源共享正向反馈

文档库相信大家应该不陌生&#xff0c;日常我们的工作模板、会议模板、求职时的简历模板、教育界的教学模板等来源方式都出自于文档库&#xff0c;随着互联网的发展和工作需求&#xff0c;文档模板开启了新型的知识变现新途径&#xff0c;通过文库小程序&#xff0c;我们不仅能…

RS-485和RS-422通信的3.3V低功耗收发器MAX3483

描述 多数公司的MAX3483速率为&#xff1a;250kbps&#xff1b; Analog Devices公司的MAX3483速率为10Mbps。 国产MAX3485外观和丝印 该MAX3483ESA为15kV ESD保护、3.3V、低功耗收发器&#xff0c;用于RS-485和RS-422通信。 每个设备包含一个驱动器和一个接收器。 该MAX3483E…

0624_ARM1

思维导图&#xff1a;

10分钟安装好torch的GPU版本(Windows)

pytorch-gpu 1. 确定cuda版本2. 确定Python版本3 开始下载-cu118-cp383.1 下载cuda3.2 下载torchvision 4.下载好了5.开始安装6. 开始验证 1. 确定cuda版本 nvcc -V 版本为11.8 , 一会下载的版本为cu118 2. 确定Python版本 确定python版本为为3.8&#xff0c;一会下载为cp38 3 …

Web自动化介绍以及8种元素定位方式

自动化理论 回归测试&#xff1a; 在进行软件升级、修改或修复bug后&#xff0c;对系统进行回归测试&#xff0c;以确保修改过的部分没有引入新的问题或破坏其他功能。回归测试通常是自动化执行的&#xff0c;并且可以通过比较测试前后的结果来确定系统的稳定性。 压力测试&am…

Android Studio 编译无错误 运行无结果一例

好长时间没写Android 代码了&#xff0c;基本规则也忘了。终于在编译成功了&#xff0c;然而运行毫无结果&#xff0c;debug跟踪断点也没有触发。屏幕赫然写着&#xff0c;execute successfully! 。 进行了各种检查&#xff0c;毫无进展。最后&#xff0c;试着重启一下AS&#…

APP启动流程

文章目录 主要构成详细启动流程参考链接 主要构成 App的启动流程主要涉及几个关键步骤和组件的交互&#xff0c;包括Launcher进程、ActivityManagerService&#xff08;AMS&#xff09;、Zygote进程、以及App进程本身。以下是详细的启动流程&#xff1a; 用户操作&#xff1a;…

【代码随想录】【算法训练营】【第49天】 [300]最长递增子序列 [674]最长连续递增序列 [718]最长重复子数组

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 49&#xff0c;周二&#xff0c;坚持不了一点~ 题目详情 [300] 最长递增子序列 题目描述 300 最长递增子序列 解题思路 前提&#xff1a; 思路&#xff1a; 重点&#xff1a; 代码实现 C…

基于Pytorch框架构建LeNet-5模型

Pytorch 一、训练模型1.导入必要的库2.设置超参数3.数据预处理4.读取数据 二、定义卷积神经网络1.定义卷积神经网络2.定义学习率3.实例化模型并且移动到GPU4.选择优化器 三、定义调整学习率的函数1.定义调整学习率的函数 四、训练模型1.设置模型为训练模式2.遍历训练数据加载器…

北邮《计算机网络》网络层笔记

文章目录 单词复习网络层前言路由算法&#xff08;构造路由表的算法&#xff09;静态路由算法自适应算法 拥塞控制QoS 服务质量&#xff08;小小的一节&#xff09;网络互联&#xff08;还是小小的一节&#xff09;Internet 单词复习 estimates boot off-line in advance refl…

揭秘循环购:消费即收益,如何助力商家月销百万?

大家好&#xff0c;我是吴军&#xff0c;今天要和大家分享一种颠覆性的商业模式——循环购。你是否听说过“消费1000送2000”这样的促销活动&#xff1f;是不是觉得太不可思议&#xff0c;商家岂不是在“送钱”&#xff1f;别急&#xff0c;让我为你揭开这背后的秘密。 循环购&…

web前端——HTML

目录 一、HTML概述 1.HTML是什么&#xff1f; 2.HTML具体化解释 二、HTML基本语法 1.声明 2. Head头标签 3.body身体标签 4.一个html的基本结构 5.标签 6.标签属性 ①属性的格式 ②属性的位置 ③添加多个属性 三、基本常用标签 1.超链接 2.图像标签 ①图像标…

从赛题切入谈如何学习数学建模

1.引言 &#xff08;1&#xff09;今天学习了这个汪教授的这个视频&#xff0c;主要是对于一个赛题的介绍讲解&#xff0c;带领我们通过这个赛题知道数学建模应该学习哪些技能&#xff0c;以及这个相关的经验&#xff0c;我感觉这个还是让我自己受益匪浅的 &#xff08;2&…

docker 配置与使用

目录 安装docker 作者遇到的问题1&#xff1a;安装docker 错误说明 解决方法&#xff1a; 作者遇到问题2&#xff1a;GPG密钥问题 问题说明 解决方法&#xff1a; 方法一&#xff1a;使用备用的GPG密钥服务器 方法二&#xff1a;使用国内镜像源 方法3&#xff1a;手动下…

项目性能优化之给dist文件夹中chunk-vendors.js做splitChunks分包,从而减少首屏加载时间

问题描述 我们项目做完,验收通过以后,就需要打包发布上线啦。于是我们执行命令:npm run build打dist包,打包完以后截图如下: 直接打包的chunk-vendors.js太大了 chunk-vendors.js文件太大了,所以我们需要将其优化一下,拆分一下 chunk-vendors.js是啥 chunk-vendors.j…

springboot+vue+mybatis穷游管理系统+PPT+论文+讲解+售后

随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多企业的之中&#xff0c;随之就产生了“基于vue的穷游管理系统”&#xff0c;这样就让基于vue的穷游管理系统更加方便简单。 对于本基于vue的穷游管理系统的设计来说…

数据挖掘概览

数据挖掘(Data Mining)就是从大量的,不完全的,有噪声的,模糊的,随机的实际应用数据中,提取隐含在其中的,人们事先不知道的,但又是潜在有用的信息和知识的过程. 预测性数据挖掘 分类 定义&#xff1a;分类就是把一些新的数据项映射到给定类别中的某一个类别 分类流程&#x…

云层之间穿梭特效视频转场PR模板素材

12 个超赞的 Premiere Pro 云层穿梭特效视频转场模板 https://prmuban.com/39056.html &#x1f4fd; 你是否正在寻找一种方法&#xff0c;让你的视频更酷、更时尚、更吸引人&#xff1f;今天推荐的12个逼真的云层穿梭特效视频转场模板&#xff0c;绝对能为你的作品锦上添花 ✨…