秘密行动

本文详细介绍了一个基于Unity的游戏开发过程,包括环境搭建、角色动画控制、碰撞检测、警报系统、敌人AI行为等核心功能模块的设计与实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整体游戏思路:

1.搭建大环境,需要添加碰撞器的添加碰撞器,需要拖的不加代码的物体都拖进去摆好.
2.创建一个脚本存放所有的tag值(注意一定不要打错!!!).和动画参数值,tag脚本不需要挂到任何一个物体上,这个类存在就是为了校对.
3.拖进玩家,先设计玩家的动画控制机. 考虑到玩家的移动和碰撞,为他添加capsule collider 和刚体.  脚步声添加AudioSource,接下来就是玩家的脚本部分 一般玩家需要的功能有 移动 攻击 健康 等
在写玩家脚本要注意尽量将玩家属性写完整,想不起来的可以后面添加. 移动类一般都是虚拟轴,结合游戏实际,代码要实现动画播放和脚本声播放
4.先把系统自带的maincamera 和 directional light 调整一下.比如玩家摄像机的跟随.挂载到该摄像机上.一些全程存在的无关紧要的组件到挂载到全局光或主摄像上.
5.重要的功能要先写,比如警报系统 警报系统考虑灯光和警报音 
5.按逻辑继续 gamecontroller 由它来控制玩家全局的触发警报机制(播放警报声和闪烁警报灯)
6.激光门模块,通过激光门要触发警报,
7.锁子模块.关掉激光门
8.钥匙模块,玩家拥有钥匙,捡钥匙声音,被捡到后自动销毁
9.门模块,自动触发,或需要钥匙开启触发
10.摄像头模块,自己做摆头动画和监控范围(trigger加光)
11.通关处的大铁门,与之前的门模块一样
12.电梯模块.电梯门无动画,脚本设定它跟随外面门一起开,类似地铁的双层门
电梯内,玩家进入后触发.电梯上升,游戏结束.
13.敌人部分,设置巡逻点.
14.拖入敌人,为他添加刚体,制作动画状态机,碰撞器,触发器(用来设置判断是否看到玩家)和导航系统
15.动画部分两层,基础层是敌人的运动,高一层是敌人的射击,边跑边射击用到动画层遮罩,手枪追随玩家需要用到IK系统.
16.敌人功能:巡逻,追捕,射击.敌人的视角,视距,转身所需角度,听距等等

笔记:

1.要学会巧妙利用root和getchild,transform.root指的是返回物体最高层的父物体
2.做游戏要一部分一部分的做,完成一个功能再完成下一个
3.写脚本尽量将所有语句都写进单独的函数里,方便调用,最好不要在函数体内部写常量,全部用变量定义成属性,方便修改
4.关于添加:  更新tag值,tag值脚本 inspector面板 被标记物体 相关联脚本 都需要更新
更新属性值 相关联脚本
5.关于组件从脚本中获取和inspector面板拖拽哪个好  拖拽虽然方便,但是他的独立性不好,每次添加都要重新拖, 并且数据易被外界改变,不安全
6.动画制作时一定要联系实际,合理判断是否勾选has exit time(动画间的过渡条件)
7.保证人物和场景运行时的指向一致,这样人物才能在场景中移动.
8.当移动点与目标点接近到一定程度时,脚本记得要假定他们相等,因为系统来不及判断绝对的相等.
9.碰撞器一般加到子物体上,大部分父物体都是空物体,添加碰撞器时需要调节还不一定准确.
10.动画控制器中动画之间的触发条件,合理考虑一下,不需要添加那么多的bool值,这样只会让脚本更繁琐,不利于代码的优化.
11.类之间的调用:定义一个这个类的对象,然后通过获取组件的方式调用
12.找gameobject时,通过名字查找有层级限制,而通过定义好的tag值找就不需要担心这个问题,而且不会有拼写的错误.
13.关于人物刚体的引入,首先不能让他被撞偏了方向,所以要在Constraints里冻结他的所有旋转,而且他肯定不能飞起来,所以要冻结他的y轴坐标
14.关于找不到实物或者类型不匹配的问题Object reference not set to an instance of an object,去组件获取那里看一下是否获取有问题
15.触发警报没有使用标志位,而是使用的位置信息,信息默认是一致的,一旦不一致,就触发警报
16. 添加audiosource时注意audiosource是和audiolistener配套使用,没有监听或者有多个监听都不能听到声音,一般系统默认会为摄像机添加一个AudioListener  Mute : 是否静音,千万不要勾选! play on awake:开机自动播放,一般只有背景音乐需要勾选.一般背景音乐都是2D的,就是不管你在哪里都能听得到,而大部分音效则是3D的,能够随着距离的远近变化. priority 音频的优先级,0是最高级,256是最次级,系统默认为128.
17.如果需要切换场景时不销毁某个物体只需要调用DontDestroyOnLoad(object target)即可
18.mathf.lerp函数的妙用,一切需要数字的过渡都可以用,而且它足够平滑.对于它的应用就不要再局限于人物的移动了.
19. Vector3.Distance(a,b) 和 (a-b).magnitude效果一样,都是没有方向的.但是从计算机内部来讲,magnitude为了计算会创建一个新的向量来计算结果,但是distance函数不需要,所以计算距离推荐distance,计算某个向量的长度推荐使用magnitude
20.常识普及一下: 有关摄像机相关操作的代码放在lateupdate里面,有关物理引擎相关操作的代码放在FixedUpdate里面
21.LookRotation(Vector3 target)是计算向前向量{(Vector3.forword)==(0,0,1)}到target的旋转量(没搞懂,求大神赐教)
22.关于为所有同类物体创建数组这个事,先都找到了再创建,有多少个对象就创建多大地方,这样也为以后的遍历减少了难度.
23.每个功能模块最好都单独写成脚本,设置一个外界访问的bool值,通过主函数直接开启功能,关闭停止功能.
24.脚本跟随不需要lerp,直接坐标相等即可但是注意一下需要跟随的坐标是xyz哪一个.
25.,因为电梯只加了trigger,所以玩家不能被电梯运走,只能在改变电梯的坐标的同时也改变玩家的坐标.
26.射击动画的唯一触发标志就是看没看到玩家.巡逻功能是利用导航(提供运动轨迹的)加动画(动画是自动播放的).停止巡逻就关掉导航,如果只关掉动画他就是划过去的,只有关掉导航他才能停下来.
27.  导航的期望速度 desiredVelocity = (target.transform.position - transform.position).normalized * maxSpeed.
28.  Animator.SetFloat(string name, float value, float dampTime, float deltaTime);
这个接口需要每帧调用,每次调用后animator对应的param的值为 
value = current + (target - current) * deltaTime / (dampTime + deltaTime);(引自灵柯阳优快云博客)  本游戏中应用:缓慢变速
29.Vector3.Project(a,b)求a在b上的投影   speed = Vector3.Project (nav.desiredVelocity, transform.forward).magnitude
30.Vector.Cross(a,b)叉乘   |c|=|a||b|sin<a,b>  向量c垂直与向量a,b所在的平面  Vector3 normal = Vector3.Cross (transform.forward, dir); cross的两个参数在nPI到2nPI之间 nolmal为负.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值