此帖记录下c#写脚本碰到的一些问题
1 if 和else if:
格式:
if(v > 0)//这里无需冒号,无需花括号,除非多行代码才要花括号
transform.Translate(Vector3.forward * MoveSpeed * Time.deltaTime);
else if(v < 0)//不写作 **elif**等
transform.Translate(Vector3.back * MoveSpeed * Time.deltaTime);
2 控制gameobject转向:
不建议直接改变trasnform.rotation的值:因为它是个四位数组:
Quaternion
struct in UnityEngine
描述
四元数用于表示旋转。
它们结构紧凑,不受万向锁影响,可以轻松插值。 Unity 内部使用四元数来表示所有旋转。
它们基于复数,不容易理解。
实际上是用这个:
transform.eulerAngles = new Vector3(0, 1, 0);
transform.localEulerAngles = new Vector3(0, 1, 0);//一般使用本地坐标的欧拉角
直接旋转:
float h = Input.GetAxisRaw("Horizontal");
transform.Rotate(Vector3.up * v * RotateSpeed * Time.deltaTime);//绕y轴旋转就是改变y的旋转角度
3 刚体JUMP的问题
如果勾选了isKinematic,那这个对象不会对碰撞和力做出反应,不受物理系统影响,但依然会对其他刚体产生物理影响(比如可以撞击其他刚体) ;
如何让游戏对象的碰撞体的空间坐标匹配跳跃的动画:
如何流畅的完成跳上障碍物的操作:
4 动画遮罩合成新动画
下边的layer优先级更高,如果静止画面和运动画面合成,应该把静止画面放下层。(原理不明)
5 准星图片预处理
canvas image 对象导入前需对图片预处理:texture type改成 sprite (2D and UI)。
6 子弹轨迹难题
1 LineRender 的position难以定位
2 LineRender的子弹轨迹线,难以定位末端点。导致轨迹线千奇百怪
(已解决)
问题原因:LineRender的SetPosition()函数可以在监视器选择是否选用世界坐标,需根据是否勾选判断填写世界坐标系下的真实坐标,还是父参考系的局部坐标。
7 timer 计时器的坑
计时器只能放在update最外层,即不需要任何条件都需要触发timer记时功能;
8 动画关键帧绑定event函数
8 LineRender 概率行不工作
现象为:同一个角度,有概率第二次开枪,有音效触发,函数也执行了,但是枪线没画。
9 状态机 + 遮罩 如何覆盖全部的动作切换
当前问题:
a 移动中开镜,不能从不开镜状态切换到开镜状态;
原因:上半身的遮罩 这个layer优先级较高 但是只设定了不开镜状态的上半身状态
解决办法:找到原因自然就能解决了,只需在上半身layer加上开镜的状态以及切换条件就行
b 左右移动的动画
解决办法:在同时左右移动或者前后移动时,优先播放前后移动的动画
10 旋转视角引起人物游戏对象的旋转
解决办法:rotate时,禁用人物x轴上的旋转,但是让摄像头跟着旋转。
11 动画播放速度太慢,没法和声音匹配
解决方法:
1 禁用loop time
2 倍速播放
12 人物血条位置不跟随屏幕
在healthbar的image对象的监视器中,transform alt 选中左下角的位置
13 添加了meshagent后,子弹打不中敌人
起初猜测是主街道碰撞体的错误设置导致;
A 这个碰撞体导致街道附近的hit信息有误;
B 最终重新去勾选、重勾选,再勾选了刚体的所有x y z的限制;射击表现正常了
14 添加了meshagent后,游戏对象消失时的动画播放位置旋转严重错乱
解决方法或原因:在Destroy(gameObject,time)方法调用之前,使用了meshagent.enabled = false方法;
15 游戏对象添加了碰撞体和刚体,为啥还能穿墙体,穿模
1 墙体也要设置碰撞体、刚体
2 游戏对象刚体中的位置、旋转约束可能会导致物理行为错乱、也可能会导致可以穿墙
16 游戏对象碰撞之后,出现自己旋转的现象
这是由于动画animator导致的,解决方法是:勾选apply root motion;动画系统中勾选Bake Into Pose,可能也可以。
17 人物穿模问题的彻底解决方法
A 使用刚体的速度而不是transform的几何位置变化来控制人物移动
//transform.Translate(Vector3.right * MoveSpeed * SpeedMutil * Time.deltaTime, Space.Self);
PlayerRigidbody.velocity += transform.right * MoveSpeed * SpeedMutil;
B 把位移控制函数或语句写在fixedupdate()里边,而不是update()里边;
推测这个方法有效的原因是显著减少了长按移动键的时候的刚体物理计算量,从而避免刚体位置错误计算结果。
18 人物跳跃动画不跟随实际刚体运动
现象:由于摄像头跟随玩家,连续跳跃时,动画不跟随实际运动,会造成当人物刚体挑起,此时摄像头往上移动,但人物的动画却在往下降落等影响视觉表现的行为。
19 人物是否着地判断,利用ray函数同时出现两种结果
这个问题可能是由于animator导致的,最终的解决方法是将射线ray的起点从trasform.position原点,向上平移一小段距离,而射线检测长度相应地向下移动一段距离。
20 UI:文字挡住按钮button,导致无法点击Button
在button的游戏对象的trasform中将它移动至前方即可。
20 线渲染器LineRenderer概率性不渲染
问题描述:函数设计当鼠标左键按下时,enable一条linerender线渲染器;没按下就disable;实际发现,如果打开scene视图,函数稳定实现功能,但如果没打开scene视图,比如打开了animator视图,函数就有概率实现不了;
问题根源定位:
问题就出在update()函数,假如按照原先的函数设计,大部分帧游戏都检测到没有按下鼠标左键而一直在执行LineRenderer.enable = false的指令,导致出错。
猜测打开scene视图,会让update()的帧间隔变大,从而降低了出错概率。
解决办法:
避开每帧检测然后disable的指令,改写函数逻辑为:当鼠标左键按下时,enable一条linerender线渲染器,之后调用Invoke()函数,使其稍后被disable()。
小结:
原则是减少当游戏无输入时,update()函数的工作量,这不仅可能导致奇怪的bug,也会加大运算量。
21 3d视角移动鼠标,感觉画面不流畅
原因:误将移动摄像机(绑定在主要控制游戏对象下)的函数,写在fixedupdate下,改为写在update下即可。