我又来了,游戏开发自学求助,怎样才能看懂自己项目的...

Tips:点击图片进入下一页



(贴尾涉及到比较具体的实现向问题,对影响观感提前说声抱歉了。但那是顺带问的,主要看主贴就好~)
前情大概就是几个月前作为策划的我准备开始自学点游戏编程基础,拖延了一大段时间从这个月终于开始学了。
把c#的基础知识重新过了一遍,然后跟着一些视频和书做了几个简单案例,掌握了一些基础的api调用和各组件间通信的方式。
但一直跟着他们的案例学总是觉得没有实际落脚的地方,而想甩开教程直接冲着自己想做的内容去实现的话,又发现想做的好像案例里都没教。。。因为构想的设计思路比较具体,网上也没找到实现教学。
虽然我知道不断跟着案例由浅入深最终肯定能触达我需要掌握的知识点,但一直脱离我自己的需求去学案例感觉实在太枯燥了,因为绝大部分时候想的都是“这个知识点我目前好像用不到啊”,根本静不下心去学,很浮躁
正好我想实现的内容跟我在公司做的项目有点相通的地方,所以我想着能不能换个思路,以读懂项目代码为目标,读懂了自己大概也就有实现思路了。
但是问题是我不知道怎样才能读懂项目的代码。。。我虽然会断点这个基本操作,但基本也就只能做到读懂单个脚本内的逻辑执行流程,比如我断在伤害计算脚本能看懂伤害是怎么计算的,但一旦走出这个脚本后就看不太懂了,每个函数都大概能猜出是用来干嘛的,但他们之间的组织关系、设计逻辑还是摸不出来。
所以想问一下,我是不是只能一步步跟着大量看似跟我想做的内容关系不大的案例去做,逐渐提升编程level,才有可能看懂项目的完整代码逻辑?还是说对于刚上手的菜鸡也有一套可以快速理清复杂项目代码逻辑的方法论?



顺便描述一下我想做的内容,希望菊苣们帮忙评估下这种级别的内容对于一个菜鸟来说要学多久才能做到自己实现,如果很困难的话我我好有个心理准备。也算是抛砖引玉看看业内大佬们有没有更好的设计思路吧(策划角度、程序角度都欢迎挑刺):
在一个基于碰撞判定的即时战斗系统中实现技能类的配置,对技能的设计目标是【有诸多参数(不同技能暴露出的参数不同)可以被外部脚本事件修改】,实际举例就是使类似【穿上某件装备后某技能从一个火球变成三个火球】这样的效果能比较容易地实现(没错就是POE)。
结合实际项目中的配置流程,我暂时想的是抛弃对技能抽象出基类的想法,而是使用基于时间轴的逻辑,用类似代码的形式逐个技能地进行配置。
配置方式为【在技能时间轴上的各帧中插入若干个执行事件】
配置内容举例如下:
===========
火球术
-第0帧:【进入动作:资源=施法,持续帧数=fb_CastTime(设置默认值=30 )】
-第1帧:【不执行:直至fb_BlankTime1(设置默认值=5)帧之后】
-第1+fb_BlankTime1帧:【进入动作:资源=发射,持续帧数=fb_ShootTime(设置默认值=10)】;【创建Item:ItemID=xxx,创建数量=fb_Num(设置默认值=1),对fb_Num能自适应的位置指定相关参数,其他参数blblbl......】(然后伤害判定等后续流程由Item完成,Item是一个与技能类结构很像的类)
===========//帧指的是一个固定的时间间隔,不随运算速度变化,【】括号表示各种执行事件,即提供给配置侧的各种基本功能单元

需求是想得挺清楚了,但谈起实现就有种完全无从下手的感觉。没头绪的点是:1.具体配置形式到底该是DSL还是原生C#?2.不管是哪一种,我都完全不知道如何去解析/调用,要怎么让程序按配置中指定的时间轴顺序执行对应的事件?

如果有热心大佬愿意留个联系方式,接受我的低频弱智提问并给出自学关键字指引的话就再好不过了



网友评论:
不太懂,但是感觉可以看看github上类似“经典飞机大战”的代码是怎么搞的。
感觉上如果想清楚了并不难……
看你说是C#我猜你用的是unity  
建议别用帧。。
是unity
为何不能用帧呢?fixedupdate可以吗?
可能没说清,我这里的帧指的其实只是一个固定的时间间隔

  -
你这个不是策划问题,是码农问题
策划只管我要个啥  当然怎么实现心里需要有数,但更多的是能不能做 和这么做的代价
这个很简单啊…就克隆个perfab然后上面挂个你说技能脚本,克隆同时对脚本赋值,脚本里用协程写个方法让他几帧之后爆炸就完了
我正在自学游戏开发,问的就是码农问题。。。基本纯新手

  -

加油,码农问题没有能帮忙的,只能聊聊游戏内容
设计量不大的话确实是可以每个技能定制化硬编码逻辑脚本,我看的教程基本上也都是逐个技能硬编
但为了使工作流更加符合我作为策划的设计思维,也为了效率着想,还是有必要抽象成一个在时间轴上组装的逻辑,具体的技能配置就像我主楼描述的那样
我现在就是不知道该怎么做才能让一个这样的配置在游戏中生效

  -

你是策划吧?那就用xml或者json反序列化成技能类的方法,你编好了逻辑,然后更新json就完了

反序列化的教程网上搜到的各不相同,而且全都看不懂
或者,抛开读配置反序列化的坎不谈,假设现在可以从配置反序列化为技能类,那是不是最后每个按我这种基于时间轴来描述的技能类解析出来都会充斥着类似
    yield return new WaitForSeconds(0.5f)
复制代码的语句?



不,只要记录0.5就够了,大致技能类记录的就是技能id 001,技能时间0.5,技能范围100,技能伤害999之类的,写个可以传参的方法就好,看来你真是新手…策划为什么要学习编程呢?如果想速成,还是网上多看点例子吧
这玩意可以简单也可以很复杂。看你策划要求。如果什么都是固定的,直接省事的做法就是做一个技能执行的类,把数据层,动画层,逻辑层,配置层等组合起来,然后用一个list包装顺序执行。个人拙见,不喜勿喷。
看来我是太浮躁了。。。只能先继续打好基础了

  -
你完全没编程经历的话就别一上来就用框架,不自己从零开始写写看是很难理解框架的妙处或是坏处的
作为策划每天有那么多新游戏要花时间去试玩,有那么多东西要去想,工作那么忙,真的抽不出时间去学暂时用不到的编程知识了
好奇楼主是怎么做到的


游戏本质上是一个巨大的循环loop,依赖于帧率每隔一个固定的时间这个loop被执行一次。所以我们就有了一个时间轴,当前时间就是每隔loop + 上次执行的delta。
如果是按照每帧算(比如一般来说STG的动作是按帧),原始的弹幕的代码一般是
if (currentFrame == 20) { shootTonsOfBullet() }
else ......

如果是按照时间算,一般是[如果当前时间大于 开始时间 + 时间 ], 执行。比如技能,表述可以是动画驱动,在动画的时间轴上给别的组件发送Event,别的组件收到Event执行相应的动作。比如一个2s的动画,第1s的时候我应该创建火球的。在Unity里具体表现为动画编辑器的Event。

或者状态机驱动(本质上是一样的),释放技能开始,等待0.5秒,创建火球。火球在创建后有自己的执行逻辑,比如飞到某个Object边上,等0.5秒,爆炸。Unity内具体表现为某些状态姬中间件。

或者代码死写,当用户按下某个按键,播放动画,WaitForSeconds(0.5), 创建一个火球,接下来都一样。如果是按代码写,想这种做法里,哪些数字是可以不用被写在代码里的。比如这个0.5s,每个技能的动画长度可能不一样,或者这个技能可能是创建一个火球,另一个可能是一个冰球,所以你可以考虑做一个持续化储存的文件,比如json。这个json结构大概就是
{  "skill1":  {  "delay": "0.5",  "object": "fireball",...... } }。 然后你的代码就读这个文件,然后填入相关的变量。当然我推荐入门不要考虑什么持续化,怎么能用怎么来。

正解不是花几天把game engine architecture最新版过一遍吗?
配置写在json或者scriptable object里 ,你策划甚至可以写excel里 然后写个编辑器脚本做成scriptable object,
动作写个有限状态机,状态里面tick的时候写condition判断情况切换状态就完事了,协程其实不太好控制启动还是暂停,不如做个迭代器手动根据情况movenext

求教为什么看楼里各位都不建议入门就考虑持续化呢?
可能因为我是先从策划的角度接触的开发,我日常接触到的都是依赖于配置的数据驱动的模式,虽然我自己不太会编程,但我还是能感觉到这样进行一定程度的抽象、让设计者通过设置参数来进行软编程的开发方式比用硬编码直接写技能要更贴合设计思路,也更规范一些。。。
不建议的原因是持续化的门槛太高还是说硬编码真的强无敌?
反正到头来都要补基础的,楼主就认命吧

因为开始最重要的是做出东西来,规范结构都是无所谓的东西,有空再往上抽象。就像先把镜头拍出来,再后期。
程序最常说的就是不要过早优化,因为需求是随时变动的。