UE4 中可全局获取的变量(例如游戏实例、玩家控制器等) 详解

目录

  • [0 引言](#0 引言)
  • [1 全局对象(全局变量)](#1 全局对象(全局变量))
    • [1.1 游戏实例 GameInstance](#1.1 游戏实例 GameInstance)
      • [1.1.1 介绍](#1.1.1 介绍)
      • [1.1.2 使用 GameInstance](#1.1.2 使用 GameInstance)
    • [1.2 玩家控制器 PlayerController](#1.2 玩家控制器 PlayerController)
    • [1.3 游戏世界类 UWorld](#1.3 游戏世界类 UWorld)
  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:UE虚幻引擎专栏
  • 💥 标题:UE4 中可全局获取的变量(例如游戏实例、玩家控制器、游戏模式等) 详解
  • ❣️ 寄语:加油,一次专注一件事!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正,同时有问题的话,欢迎大家留言讨论。

0 引言

在游戏开发过程中,有一些变量经常需要被别的蓝图调用,但是这个变量又不是全局变量。所以使用前需要通过Get Actor Of Class(获取类的actor)的方式获取对象的引用。但是假如我们将经常需要用到的变量存储在全局对象当中,下次别人要调用就直接通过这个全局对象来访问这个变量。

1 全局对象(全局变量)

🎈对象其实也是一种变量,所以全局对象 也可以叫做全局变量🎈
在UE4中,有一些全局可获取的变量,可以方便地访问和管理游戏的各个方面。

  • GameInstance 游戏实例
  • GameViewportClient 游戏视口客户端
  • UWorld 游戏世界
  • GameModeBase 游戏模式
  • PlayerController 玩家控制器
  • Actor 演员

通过这些全局变量,开发者可以方便地访问和管理游戏的不同方面,从而实现更灵活和高效的游戏逻辑和交互操作。
拓展:在UE4切换关卡时,下面这些全局变量不会被释放:

  • GameInstance 游戏实例:游戏实例中的数据将在切换关卡时保留,以便在下一个关卡中继续使用。
  • PlayerController 玩家控制器:玩家控制器是负责玩家输入和控制的对象,它们在切换关卡时通常会保持不变。
  • GameModeBase 游戏模式:游戏模式定义了游戏的规则和逻辑,它们在切换关卡时通常会保持不变。
  • 主角色(APawn、ACharacter):游戏中主角的演员(Actor)通常会在切换关卡时保持不变。
  • 关卡关联的演员(Actor) :如果某个actor在关卡编辑器中被直接放置在关卡中,那么在切换关卡时它们通常会保持不变。下图所示,每个actor都有自己所属的关卡

    需要注意的是,不会被释放的变量只是在切换关卡时会保持不变,但在游戏结束或重新加载游戏时可能会被重置或释放。此外,其他不直接与特定关卡和角色关联的全局变量也可以在切换关卡时保持不变,如全局的游戏配置、游戏状态等。

1.1 游戏实例 GameInstance

1.1.1 介绍

UGameInstance :游戏实例,它负责保存和共享游戏的全局数据和状态。可以在项目中创建自定义的UGameInstance子类,通过GetGameInstance函数获取当前的游戏实例,并使用其中的变量来存储和访问全局数据
GameInstance是UE4中的全局类,只有一个实例(就像是单例设计模式,只有一个对象)
GameInstance常用的函数与用法

  • Event Init (事件初始)与 Event Shutdown (事件关闭),引擎初始化与关闭时执行的逻辑。

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/e739d8b0decd4457a010b9d1b8f7b5c3.png#pic_center =360x

  • 为游戏保存全局数据 :比如上一个关卡的信息需要在下一个关卡使用时;只是临时数据,游戏结束则消失;则可以将这些临时数据保存在GameInstance中。(假如需要持久保存数据需要用SaveGame,也就是将数据存储到磁盘中)

1.1.2 使用 GameInstance

  1. 首先新建蓝图类继承 GameInstance 基类
  2. 在项目设置中配置游戏实例类为我们刚才新建的游戏实例类即可。(不配置的话游戏运行还是使用的默认的类)
  3. 在其他蓝图类中获取游戏实例对象

    深入思考:通过获取游戏实例得到的其实是父类的指针(应该是父类指针指向子类对象),但是使用父类指针是访问不了子类中特有的函数的,所以就需要进行类型转换(UE的类型转换在C++中对应的就是static_cast、dynamic_cast等类型转换函数)。

这是一种抽象编程的思想,假如【获取游戏实例】函数获取的不是父类指针,而是直接获取对应的子类指针,而且我们也不知道未来会有多少子类被定义。不能新定义一个子类,我们就去修改【获取游戏实例】函数的源码,很显然这种程序设计思想太垃圾了。

1.2 玩家控制器 PlayerController

玩家控制器 和 GameInstance 使用方法很类似

它也可以通过【获取玩家控制器】函数获取父类指针,然后类型转换为子类类型之后就可以使用功能。
使用步骤:

  1. 新建一个子类派生于 PlayerController
  2. 设置【项目设置中】选择新建的玩家控制器类(首先得新建一个游戏模式的子类,才能选择玩家控制器类)
  3. 使用

1.3 游戏世界类 UWorld

在UE4中,UWorld是一个重要的类,代表了游戏世界的实例。它是一个容器,用于存储和管理游戏中所有的Actors(角色)和Objects(对象),并负责协调它们之间的交互和逻辑。

这部分内容了解的还不多,挖个坑,等学习熟练之后再将这部分内容补全。

相关推荐
唐诺3 小时前
几种广泛使用的 C++ 编译器
c++·编译器
冷眼看人间恩怨4 小时前
【Qt笔记】QDockWidget控件详解
c++·笔记·qt·qdockwidget
红龙创客4 小时前
某狐畅游24校招-C++开发岗笔试(单选题)
开发语言·c++
Lenyiin4 小时前
第146场双周赛:统计符合条件长度为3的子数组数目、统计异或值为给定值的路径数目、判断网格图能否被切割成块、唯一中间众数子序列 Ⅰ
c++·算法·leetcode·周赛·lenyiin
yuanbenshidiaos6 小时前
c++---------数据类型
java·jvm·c++
十年一梦实验室6 小时前
【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)
开发语言·c++·线性代数·矩阵
taoyong0016 小时前
代码随想录算法训练营第十一天-239.滑动窗口最大值
c++·算法
白乐天_n6 小时前
腾讯游戏安全移动赛题Tencent2016A
安全·游戏
这是我586 小时前
C++打小怪游戏
c++·其他·游戏·visual studio·小怪·大型·怪物
fpcc6 小时前
跟我学c++中级篇——C++中的缓存利用
c++·缓存