|
还是提一个实际一点的建议吧.
从你的实际需求出发,比如要做一个动作游戏.
好
要不要像其他游戏一样来个先logo,然后选择模式,或者设置东西什么的.
如果要,那你想想如果要实现这些东西应该需要什么.显示logo,首先你得能知道怎么显示,创建个GameObject,添加一个RawImage,RawImage的texture,设置为你要显示的图片.
那这里就会有几个问题.GameObject是代码动态创建,还是做个预设?使用RawImage还是Image?怎么样加载logo图片然后赋值给texture?如果要做淡入淡出该怎么做?更好一点的效果,希望淡入和淡出的速度不是恒定的而都是越来越快的.
做个预设,使用RawImage.因为logo图片一般比较大,使用Resources.Load.AssetBundle.LoadAsset或者在面板上静态赋值.使用别人常用的DOTween或者自己实现去操作RawImage.material.color.a,毕竟比较简单.变化速度越来越快,可以给DOTween加个曲线,或者自己调用内置的AnimationCurve,根据时间取对应的值.也或者自己写一个合适的公式.计算实时的透明度,比如alpha = time * time * speed.
下一步,关闭logo,显示选择模式的界面.
做个选择模式界面的预设.然后是点击响应.获取到点击某个GameObject的操作后,执行相应的逻辑,设置当前游戏模式,保存到某个生命周期长的类,一般都是全局的一个类,然后跳转到下一个流程.
这里也有几个问题,怎么获取到鼠标点击了某个GameObject,可以使用UGUI自带的EventSystem,也可以自己检测鼠标左键按下,根据当前摄像机生成一个射线,检测射线是否与GameObject的BoxCollider相交.游戏模式这个值保存在哪儿,自己写个GameCore?然后怎么跳转到下一流程,怎么划分流程,流程与流程之间是什么样的关系,怎么样存储这些流程,在什么时候执行什么流程.
假设你现在角色已经选好了,对手也确定了,然后点击开始战斗了.
开场,双方都应该是待机状态,或者说待机动作.那这个动作怎么来,你是用的2D图片还是3D模型,如果是2D图片,那这些序列帧是从哪儿来的,怎么知道有什么序列帧,哪个序列帧是什么动作,序列帧播放速度是多少.循环播放该怎么处理,不循环播放该怎么处理.3D模型,模型资源在哪儿,什么时候加载进来的,材质,贴图,shader,以及预设上有没有附带其他的东西,预设在代码中是用哪个类去存储和访问的.模型该怎么播动作,Animation?Animator?
假设可以正常播放动作了,
你按下一个键,控制的角色需要放一个技能.技能包含什么,动作,特效,基本就这两方面,另外看不见的还有攻击范围,攻击范围还分可移动的范围和不可移动的范围,比如打出一个直拳,那就是不可移动的攻击范围,你打出来在哪儿,就判断哪儿的范围.你发出一个冲击波,冲击波会动,一直飞向你的对手,这就是可移动的攻击范围.当然这两个其实都是一个东西,只是一个移动速度为0,一个移动速度不为0而已.
按下按键,角色开始做一个直拳的动作,当拳头伸到最远处时进行碰撞检测.这是理想的过程.嗯.所以怎么才知道拳头伸到最远了,其实可以算出来,或者预先算好,反正动作固定的,只要播放速度不变,伸到最远的时间也是不会变的.比如第10帧时拳头伸到最远,每秒30帧,那就是0.333秒的时候,也就是说当你按下按键过后的0.333秒时就可以判断是否击中了敌人.既然碰撞检测,那就要有碰撞双方的碰撞体,敌人可以是一整个碰撞体,你的拳头是一个碰撞体.这只是看起来.实际上只是在你的拳头的位置上有一个BoxCollider,因为你的动作是固定的,所以这个BoxCollider实际上跟你的拳头没有半点关系,因为我也不知道你现在拳头到底在什么位置,我只知道需要在0.333秒时在角色本地坐标系下的指定坐标上启用或者创建一个BoxCollider.敌人的碰撞体呢,就是在敌人的本地坐标系下的指定坐标启用或者创建一个BoxCollider,当前,敌人的这个BoxCollider应该一直都启用的,表示你在任何时候都应该能有机会打中敌人.虽然两边的BoxCollider都是本地的,但是检测是在世界坐标系下的.怎么进行碰撞检测,你可以使用MonoBehaviour的OnTriggerEnter或者你已经知道了这两个碰撞体,自己计算来检测.
假设已经释放一个技能打中了敌人,然后敌人应该做出反应吧,怎么反应,直接飞出去落到地面弹两下,还是双手抱肚进入僵直,还是向上击飞?还是直接趴地上.
我也就是简单说了一些要实现你的需求应该会遇到的一些细节问题.涉及到的范围很广,并不是视频里面的哪些要什么就有什么,一点困难没有.其实真的很难.尤其是要提升细节表现时.
从需求出发,自己要做什么,怎么做,缺什么,做完以后,然后再回过头来想,哪些地方我可以改成什么样会更好.之前那样写,如果要调整一个数值,或者一个功能,要改很多地方,而且很容易漏掉东西,导致bug频繁.哪些地方代码很相似,却写了很多遍.哪些地方代码看起来的功能跟实际要实现的功能感觉差距有点远,哪些代码可以用更简单的方式来实现 |
|