【虚幻4】UE4纯蓝图初学者进阶教程-制作一个回合游戏(合集)全中文教程 1-4

随手写的,将近一万字,懒得二次整理了
内附工程源码,见评论区!
一、教程笔记—————————————
由于我从26课开始才想着要记笔记,前面可能也有很多可以写的地方,但是不想再看一遍了
而且由于我是开2倍速看的,30节后面几乎是3倍速+跳进看的,这份笔记肯定是不全面的,仅供参考
笔记这块只是简述,后面自己做的时候可能写了详细说明
第26节
多格式文本需要设置样式,且每次修改配置后需要编译才可预览
需要注意UI绑定属性是每帧执行的,最好用事件驱动UI
第12节
敌人变色直接在材质里做动画就行
第11节
菜单说明,最好定义枚举,根据按钮的枚举弹出说明,根据枚举游标计算偏移位置即可
第9节
过场动画的图片,20次复制粘贴的部分,可以尝试用for循环写,也可以尝试在材质实例里实现
第8节排序算法
考虑封装函数库,方便类似的情况使用
第7节
删除再添加玩家实体,缺少这么做的意义,不如直接移动,因为玩家实体内存了太多必要数据了
第29节
存档头像、先手列表头像等,建议存入一个数组,然后遍历设置
第30节
读取后,创建只写一套,根据是否读取决定数据而已,善用branch等流程控制
第31节
怪物掉落数值可以放到怪物数据表格中,在结算时根据怪物ID去取
第33节
删除生成玩家没必要,可以记一下死掉的index即可
第35节
可以不用定时器触发函数,这种0.01秒一个计时器,不知道会出什么问题,实际上等于一个tick函数
第36节
道具效果,同类封装,改变属性的上下限等处理应在属性内部写,而不是在效果内写,同理,死亡亦可写在属性内,再传出通知
这块没具体研究,UE的游戏属性类,官方文档中提到自带了响应属性变更的事件,可以在属性变化时进行上下限处理
第37节
道具选中敌我改用委托
第47节
直接设置game input mode
UI内写reset和init,没必要移除控件再重新创建,移除后是需要等待进行垃圾回收的,每次创建都是新生成一个对象
由于翻译问题和查找方便问题,建议使用英文引脚和函数名,在编辑器设置的语言部分
循环,写for和break、while更清晰
数据表格主键,类似数据库主键和map的键值对概念,UE内叫row name
升级经验动画的简化,可以直接tick,根据delta计算变化量,再设置给进度值/数字显示
大拇指没必要复制粘贴多份蓝图,做成一个子控件,存入一个数组,再进行显示隐藏的操作
二、实际开始制作的笔记—————————————
最核心的是,用数据驱动表现
地图关卡、战斗场景actor、gamemode、playerController等,哪些逻辑放在哪个部分,是需要明确的规则来区分的
很多逻辑可以直接写在战斗场景里,而没必要在几个蓝图之间来回调来回传,战斗的逻辑强绑定在战斗场景这个actor内,需要复用时通常只会改变配置/数据,如生成角色位置、摄像机位置、场景大小等,可以放到数据表配置中,亦可创建新的不带逻辑的战斗场景2,再把2的数据传给战斗场景1进行覆盖
例如移动角色进行攻击,移动和播放攻击动画、显示伤害数字,均为客户端表现,不需要用gamemode写,gamemode只在服务器上运行,服务器实际上只需要知道谁打了谁,打了多少伤害即可(即走一遍伤害/技能/道具效果计算流程),然后再通知场景进行表现。
战斗场景可以视为一个统管所有进入战斗后的逻辑表现的actor,所以也可以在触发进入战斗时动态生成该actor,一样能复用的
UE5中一些同类节点被折叠到一个节点中了,例如multiply,拉出该节点后可把节点引脚转化为任意数据类型,比如vector,默认拉出为vector*vector,可改变引脚为vector*float(第一节移动玩家到敌人的方向*100来保持玩家移动后离目标的距离),另外AI Move To 节点的acceptance radius参数就是这个作用,没必要自己再写一遍
各种位置和旋转,直接初始化的时候赋值arrow数组变量,再从这个数组里取就行,不需要来回设置再取值
动画蓝图里传伤害值也太秀了
死亡动画直接在动画蓝图内的状态机管理即可,根据动画所绑定角色的是否死亡布尔值来决定是否从正常idle+run状态转到dead状态
UE5的蒙太奇可以直接设置一个动作的自切割片段和片段间顺序,一个动作也可以实现死亡后一直躺地上的,见Death_Montage
生成角色时存入数组并标识编号,出手顺序可以直接根据编号取到速度,再按高低把编号存入新的int数组作为出手顺序
严格定义战斗开始、回合开始、角色行动开始、角色行动结束等战斗流程节点
继承自怪物base和玩家base的玩家1类、玩家2类没有意义,如果只有变量的变化,完全可以放入配置表内,生成式读表包括mesh等。一些配置可以放入继承自object的空类内,作为纯数据对象,在gamemode初始化时实例化(单例)
UI动画结束、蒙太奇动画等不要用delay硬写来控制时间,用绑定委托、事件通知等,UI动画有bind蓝图节点,蒙太奇可在内部设定通知,在播放蒙太奇的蓝图节点引脚会触发对应通知时间
Actor的widget组件,draw指的是绘制的大小,居中可以设置pivot,这个决定相对位置百分比
可以把血条的细节下的UI的space属性设为screen,即可在UI层渲染而非场景层,位置可通过在mesh组件挂一个点,在该点挂血条,来控制血条位置,或是直接挂在mesh下
血条的信息更新可以通过事件驱动,见官方文档https://docs.unrealengine.com/4.27/zh-CN/InteractiveExperiences/UMG/HowTo/EventBasedUI/
蓝图接口是规定函数名和输入输出的,具体实现由继承接口的蓝图内写,即不同蓝图需要不同实现,但作用和输入输出相同时使用,例如动物饿了要吃食物补充能量,输入为食物,输出为能量,有的动物是前胃发酵来消化,有的是后肠发酵,UP主这样用倒是实现了一种事件多播的效果,这块没具体研究蓝图部分,但是按理说可以通过bind自定义事件做到类似的效果,不知道是我理解错了还是教程用错了
摄像机位置,不用写死位置,可以通过摄像机组件的transform属性拿到相对位置Relative Location,因为这个属性在transform的结构体内,所以直接输入location找不到对应节点,需要先取到transform
然后再根据取到的location做计算进行移动来实现进入的效果。结果发现这不就是个动画吗?UE一定有自己的功能可以K摄像机动画
进入战斗的摄像机效果,应该通过动画来实现,查了下UE5内置了ActorSequence,在摄像机所在actor内添加该组件即可使用,使用原理同关卡序列(sequence)UE4需要下载该插件
选中敌人的变色,也不需要用定时器做,做一个0.01秒的定时器其实就相当于一个tick(unity的update,每帧执行),在角色材质/组件写一个tick判断IsSelecting变量,为真则设置显示,之后设置该bool值为假,然后在写了选中逻辑的地方tick,选到角色时则给这个角色设置IsSelecting为真(几个节点搞定的东西我调了一小时,被自己蠢哭)
视频背景材质那里,UE5报错提示LoglmfMedia: Error: Tracks 000009D6AE400F10: Format is not supported in D3D12.
根据关键字百度后,在b站视频BV1uq4y1A7M6评论区找到解决提示
UE默认不支持DX12下的MP4格式解码,装个插件改下解码器就行
打开工程后左上角,编辑->插件,找到electra player,勾上后重启项目启用插件,然后再打开media player,解码器选electra player,就可以播放了
另外建议UMG做的各个UI最好按照功能模块制作成分别的控件,梳理好层级,最后再一起放到整个战斗内的大UI下,直接在这里完成所有的UI操作,GameMode和战斗场景等就可以只操控这一个UI对象即可
例如我把单个玩家信息板做成一个控件,在战斗大UI下放一个垂直框,进入战斗时玩家数组传给大UI,for each来遍历生成每个玩家的信息板,把各个玩家传给单个信息版并调用信息板的初始化函数
其他模块UI同理
大坑点,教程都是先生成玩家控制的所有角色的pawn,再在这个pawn内处理该角色的各种数据,而pawn实际上是一个必须在场景内存在实体的actor
这就导致这种写法在处理角色的非场景信息时,还必须存在场景的实体,例如角色的等级、经验等,所以教程里各种来回传角色信息,,角色属性数据和实体之间的界限非常模糊,写的很乱
当角色本身做复杂时,不得不给每一个相关的object,例如game mode、game instance、map、game controller、battle scene,来回设置这些变量并传递信息
外加属性写的也非常临时,如果再加上装备和天赋加点等设定,根本没法维护
例如做个玩家所有的角色的信息面板界面试试,在战斗外打开能打开该面板的那种,很难写
暂时想到的更好的做法是,先把角色视为一个数据集,单纯继承自Uobject,其内包含角色需要的所有数据,例如一级战斗属性通过角色类型ID读取角色表获得,二级战斗属性通过函数库在一级属性变化时同步更新
其他包括移速、升级属性等,都在该object初始化时,通过角色ID生成,可以设为init函数,生成对象时调,或者弄成构造函数
然后进入战斗则根据该object属性,生成对应的pawn,而这个pawn实际上只是用来处理表现的,模型的移动攻击啥的,不存在任何数据, 只负责在场景内的实体表现
离开战斗删除pawn即可
角色信息等,都可以根据角色object来生成,存取存档数据也存该object就行了,根本不需要每次进入战斗时根据角色类的类型再处理各种生成
坑点, possess之后立马设置摄像机,会出现视野转到目标位置了,但没绑定到摄像机、视角不跟着摄像机移动的情况,延迟一帧也不行,延迟两帧再set view target又对了
原本是玩家操控pawn的,然后操控单位遇敌后,进入战斗场景,有个离开原场景摄像机动画,和进入新场景的摄像机动画
由于进入战斗后的操作是交给ai控制pawn的,玩家负责下达指令
所以我在完成离开原场景后,进入的瞬间possess这个玩家的角色给ai controller,并设置视角到战斗场景,随后立即播场景内的摄像机组件动画
动画是正常播的,但是视角显示没有变化
推测为possess执行时,不光把pawn和controller进行绑定,同时还会设置摄像机到视角,而其执行顺序和周期本身是不能保证在之后自己加的的set view target,这个节点的后面的什么时候执行
完成possess的所有操作的花费时间不一定是固定的,且蓝图内没有完成的回调节点,只有改变controller的事件绑定
该坑点还导致不好写存档系统,比如你敢写个返回游戏开始界面吗
因为savegame类,在蓝图内没有提供保存实例化对象的节点,只能保存基本类型和基本类型组成的结构体类型的变量
所以必须把玩家信息的每一个变量都在savegame里写一遍再存取一遍,非常麻烦
当然并不清楚一个单纯继承自uobject的、用于存储玩家数据信息的对象,savegame在蓝图内能不能存取,这个没有去试验
升级经验效果那里,完全可以直接把升级前后的各种数据给UI,即当前EXP、等级,获得的EXP、EXP经验表,UI自己做表现,不可能把这种动画的timeline弄到角色类里然后设置一大堆变量的
UI对象的销毁,据程序朋友说,为UE的GC自动进行对无插槽的widget的销毁回收
所以虽然remove from parent,执行后依然能在调试对象中看到该widget,但是之后UE会自动进行回收
第28节
控件接口那里,可以把所有能esc关闭的控件都实现该接口,然后在这些控件的构造函数内将自身存入player controller的widget数组内,回到场景则清空数组,每打开一级窗口,则add数组,按esc则移除数组内最后一个控件并移出数组
由于event anydamage 只能放在受到伤害的actor内,为了模块统一,考虑把伤害事件写在rolebase内,或者额外写一个object用来处理这些东西,再挂给role
教程中的道具和技能做的实在是糟糕,根本没法维护,我这边做的时候,严格
特效等资源,直接复制粘贴的话,需要保证目录的一致,教程资源均需粘贴到content根目录下,导入成功后可再进行迁移位置
如果发现有错误,最好先看看输出日志,比如我这个特效因为粘贴的目录不对,进去之后会播不出来,丢了材质,因为材质的引用路径不正确,也报错了找不到文件
游戏的数据,最好按照层层关系进行处理,例如所有的图片ID引用,用专门的表做,在用到的地方填ID来这张表查
效果也归类到一起,例如道具和技能,本质上都是执行一段战斗内的效果,这个效果的属性可能包括目标、效果、效果数值等
目标为,作用目标范围(敌我)、作用数量、选择类型(主动还是随机)
效果为,效果类型、伤害、治疗、复活、加buff等
数值为,参考基数(最大生命50%?力量*10?)、系数、来源等级系数(1级力量*10,2级力量*15)等
而且尽量有限的属性都写成枚举值,这样不容易出错,后期也好修改(改ID、插ID啥的)
这里只是浅浅的举个例子,游戏的实际开发的数据复杂量要大得多,而这一部分主要为数值策划的工作(配表工具人就是我了)
道具的使用特效,简单点也可以直接放表里,用的时候再取,复杂点可以专门把经常需要变的特效参数,如持续时间、变色等,提到特效表再从道具表读
数据相关根据自己需求来即可
很多数据实际上在整个游戏过程中也只存在一份,且不随关卡地图的变更而销毁,完全可以把这些数据放到GameInstance里,游戏实例
道具这块做好UMG的控件分层,基于自己的习惯,比如道具,在背包、战斗内、商店,这几个应用场景内的界面样式可能有不同,但又有很多复用的逻辑
可以把逻辑相同的部分放到一个控件内,再基于这个控件做针对需求的三份控件,也可以都做在一个控件里设变量进行不同的init操作
玩家的输入,默认只有player controller会接收,可以在actor的属性面板内打开选项来让该actor接收用户输入——auto receive inout
做到后面真的是没耐心继续做了,这份笔记也写不下去了,记不得自己和教程里哪些点不一样,优化了哪些,哪些做的不如教程
总有个思想就是,觉得这个项目只是自己拿来练习用的项目,而做到后面,教程也没有教出什么新东西,用到的知识点几乎在前面都用过了
所以你教程看完的话,会发现UP主后面也做的很水,教程完全是草草了事。一开始我还觉得很不爽,结果自己也是这个心态
而且既然是学习用,学到了这项目也就废了,做出来的完全没有可玩性和可维护性,也不好扩展,不如下个项目见,于是更不想继续做了
三、总结——————————————————————————————————————
花费时间较长的部分
1、整理美术资源——这部分因为用教程的资源,实际上是节约了大量的时间的
2、UI拼接——这块重复劳动感很强,总感觉在做体力活,花的时间也长
3、同一个引用在多处重复设置变量——他们都应当指向同一份数据,而如果不是引用类型的话,实际上每个对象内都是分别的副本,需要来回进行数据的传递进行更新,很容易出错还花时间
4、debug——都是些经常犯的小错误居多,最好注意下哪些地方经常犯错,有意识的去多注意这些地方
个人经常犯的小错误
1、for循环后把只执行一次的东西放到了循环体内
2、数据用完后、重置状态时,没有清除脏数据,以防万一可以用完后clear一下,初始化时clear一下,养成习惯,费性能的话大不了最后再优化
3、index是从0开始的,length是最后的index+1
4、线连的太长,以至于超出预想的执行效果,蓝图执行该节点时,对象属性均为该蓝图内的引用,比如我在节点1设置了a的值,之后过了n个节点直接在节点5处取节点1的a值引脚,而中间又在节点3对a进行了++之类的操作,此时在节点5的a值是++后的值
其他经验分享
1、刚学的时候,不要想的太遥远,容易炸,尽可能先找自己能理解的教程去照着做,实在理解不了就硬着头皮多看几遍
2、第一个项目会因为自己认知和熟悉程度不够,而有大量的渣写法,所以确实是最好当练手,以学习为目的去做
但不要因此就做个半成品,起码流程得完全做通,才能保证自己真的掌握了,下次做的时候才能写的更好
3、避免重复造轮子,当你想实现一个东西的时候,最好默认UE有这个功能,如果实在找不到再考虑自己实现
例如场景组件的动画,在actor sequence插件内可以直接设置播放时的玩家禁用移动输入等操作
4、尽量用数据驱动,数据层和逻辑层和表现层严格分离,界面表现用拿到的数据仅做展示,逻辑控制这些数据的关系,区分好输入数据
例如玩家的所有信息都可以先弄成一个数据集合型的object,然后再在进入战斗、进入场景时,用这些数据生成场景内的actor,这个actor只负责移动攻击、模型和动画,以及接受这些事件的通知
5、数据表可以通过excel进行大批量配置,再导出成csv生成UE内的数据表
这块教程网上也很多,在UE内编辑数据表很不方便的,例如1-100级的升级所需经验,总不能手敲100次吧?
————————————
6、如果你想做独立游戏,动手前先解决素材问题,再解决可玩性验证,再初步完成数值设计,最后再动手做
因为前几步都会影响实际的程序开发,最好是先想清楚再做,不然做着做着就只能成练手作品了
7、尽量独立制作,不要想着靠别人帮忙做,大多数人三分钟热度,而别人退出合作,即会打击你的热情,也很可能导致项目荒废(意见不和、技术领域不同等)找新的人又得重新磨合
当然,找人帮忙解决一些小问题是可行的,越小越细的事情越有可行性
8、多总结,总结虽然花时间,但总结的过程可以帮助理清思路
DONE——我完成的部分
创建人物、人物移动控制
进入离开战斗,回合开始结束、人物行动开始结束
移动、攻击、被攻击、死亡动画的控制
人物战斗信息UI
战斗菜单
出手顺序排序
血条UI、伤害跳字
摄像机过场动画、摇晃效果
选中敌人时特效
战斗胜利结算UI
战斗失败
游戏开始界面
存档读档
经验系统和升级表现
角色详情面板
左上角挂操作介绍
道具和货币系统
背包
商店
道具效果
设置
NOT DONE——没做的部分
技能——放弃
复活效果——放弃
设置声音、攻击时移动到场景中心——放弃,无意义
几个没做的点,我觉得教程中的做法也很临时,基本和道具类似,没什么参考价值,就没去花时间做了,感觉照着做只是纯体力活
还可以优化的点:
比如地图内放置的怪物碰撞点,可以通过数据表生成,定义每一行为一个怪物数据,配置包括 1id 2碰撞点location 3怪物ID数组
然后可以在map里遍历该数据表生成对应的actor在场景内
四、编辑器和项目相关——————————————————————————————————————
UE5和UE4相比变化并不大,主要区别在一些入门的人用不到的技术美术、渲染相关的地方,基本上UE4的教程都是可以直接用UE5复刻的
我一开始用的是UE5.0.1源码编译版本,因为用了VS2022,最新的编译器有些问题,改了UE5默认使用的编译器版本配置,版本为14.31.31103
https://forums.unrealengine.com/t/unhandled-exception-when-building-blank-project-version-1-2-is-not-supported-version/510668/7
需要安装VS才能进行打包
UE 最新版 5.0.2,已经解决了和VS2022的编译兼容问题
项目设置相关:
这个地图资源挺吃资源的,运行的时候帧率跑不满,项目设置使用固定帧率的话,如果GPU性能不够跑的,帧率达不到设定的固定帧率,会对一些tick下的计算早成一定影响
打包出来我的1080+4K显示器,只能跑到十几帧,而GPU并没有吃满,好像GPU摆烂没工作一样
调了半天之后,在项目设置里开了前向渲染,意外的解决了,但我的电脑跑满GPU也只有60帧上下
Shader学习 (20)延迟渲染和前向渲染 - 九猫的文章 - 知乎 https://zhuanlan.zhihu.com/p/386420933
另外UE5不知道打包的哪些设置不对,初始的 空场景,只有一张图和几个按钮,我的华硕猛禽1080跑满100%,在4K分辨率下只有100帧,调成720P则有600帧,1080P300帧,2K为200帧
显然一张图就把4K的显卡吃满了是不太能接受的
另外分辨率、窗口模式之类的设置,打开发包出来,是保存在——项目导出文件夹\WindowsNoEditor\项目名称\Saved\Config\WindowsNoEditor\GameUserSettings.ini
开发包默认无该文件,可以参考 https://answers.unrealengine.com/questions/206504/how-to-default-fullscreen-in-shipping-package.html
项目设置中有GameUserSettings类,可以创建蓝图类,在项目设置中选用该类,来处理这些设置的保存
教程提供的资源,本身占用空间就达到了2.9G之大,开发包,内容全进包,打出来的PC开发包大小为3.08G,发行包1.37G,感觉算可以接受的了
主要是地图和玩家模型占空间大,删掉所有未使用资产将近700个后,资产占用也有2.6G,打出来发行包为1.26G
另外开启 排除编辑器内容 打出来的发行包只减小了不到1M
烘焙所有项、只烘焙地图 ,打出来的包小了100M
而在删除掉所有未使用的资产之后,项目压缩包小了400M
但打出来的包,和只烘焙地图,一模一样大,一个字节都不差——1.26 GB (1,361,464,156 字节)
这一块整得我很迷,怎么可能出现一个字节都不差的情况呢?
推测可能是发行包本身打出来的时候,未使用资产也是不进包的,而烘焙是直接用工程目录下的cook进行二次压缩进包的,这部分烘焙没有排除未使用资产

官方文档有这一段话
——尝试确定项目的最终大小时须注意,项目的开发版本将略大于发布版本。
——在Medieval Match游戏范例中,开发版本与发布版本之间的容量差异约为14%。但各个项目的要求有所相同,因此两个不同项目版本之间的容量差异可能大于14%,也可能小于此值。
而我这个开发和发行包差异这么大,不是很理解,未引用的资产也只占到400M
有关包体减小部分,建议直接看官方文档,基本上很全
https://docs.unrealengine.com/4.27/en-US/SharingAndReleasing/Mobile/Android/ReducingAPKSize/
这个讲的也不错https://chowdera.com/2022/01/202201240934569241.html
五、工程源码分享————————————
链接:https://pan.baidu.com/s/16P949_e4xG_9Lnq_1RJ2Pw
提取码:ws1s
一个是项目压缩包,一个是打包出来的开发版本包(development),一个是发行版本包(shipping),一个是删去未使用资产的发行包
我这份是UE 5.0.2源码引擎,但项目是纯蓝图项目
然后我用Epic Game Launch 另外下了一个UE5.0.2 打包不需要编译shipping版UE5,非常快
而源码版本,只要项目目录变更,就会重新编译一些打包工具链 而且非常慢,我的9900K超频4.4G,需要编译将近1小时
两个版本打出来的发行包包体大小相差不到0.2%,而引擎的占用空间,源码版本大约270G,二进制版包括c++调试,也只需要100G以内
可以说除非你需要改源码,不然完全没有用源码编译版本的必要,强烈建议去launch下载二进制版
制作的时候,实际上只有前两节参考教程的比较多,后面就完全是看个开头看看教程准备做啥,然后直接自己丰衣足食了,所以本项目和教程的实现出入较大
且未经优化,做到后面做烦了,大量的临时写法
发行包打出来才发现分辨率设置没生效,因为其不包含用户设置配置文件,类似的坑踩了很多
我这个项目总共花费了8天时间制作,其中打包、MP4解码、帧率低、研究UE5项目设置、摄像机+UI动画,这几个部分起码花了2天
外加开始不熟悉各种节点和蓝图的数据传递,前几天做的不仅慢,弄出的bug也多
六、杂谈————————————
入行两年半了,入行就是大厂数值,虽然项目没成,但相比很多人我已经很幸运了
外加现在明显感觉进步变慢了,渐渐地日常工作学不到东西了,索性直接回家摆大烂,打打游戏找找初心
这次开始学UE,主要是自己除了工作经验之外,没有任何拿得出手的东西证明自己的价值,找工作非常头疼
外加多学点东西总是有好处的,既然数值层面很难有长进,那就扩宽知识面,实在找不到理想的工作就自己在家憋独立游戏
之前第二个项目3个多月就解散了,当时用的就是UE4+c++,因为项目干的不舒服还自己偷偷学了下怎么实现的,然后自己动手做了项目的一个剧情部分的答题小游戏
而第一个项目干了2年,用的是Unity+C#+LUA,服务器是c++。大量的技能配置很难搞,最后是程序实现接口,策划用lua写技能脚本进行二次拼接
毕设用的是unity做的游戏,这次又自己做了UE5回合游戏DEMO
总的体验下来,重要的还是人,引擎这东西很多思路和用法都很接近,对策划来说要想做好游戏,接触的肯定得多,也得会用
当然你入行后可能会发现大量的人不会用引擎,因为他们都在策划本职工作上被程序美、制作人或者老板整的很难顶,外加没有编程基础也很难理解引擎
但是你会引擎,你不容易被程序忽悠,好把握其他人的工作量,也能节约和程序美术的沟通成本,在做功能的逻辑梳理和数据表结构制定时,也能更优雅
另外想靠这个教程入行程序,估计是不太靠谱的,蓝图程序员作用太小了,能实现的东西有限,好一点的游戏公司都不太会考虑你的