Unity3D零碎笔记

新装unity渲染问题
阴影

在灯光的inspector中,设置Shadow Type为Soft Shadows,并适当调整参数

1.png
光照烘焙

Windows —— Lightning中,设为Auto

2.png
抗锯齿

Edit —— Project Settings —— Quality中,调整抗锯齿等级 Anti Aliasing

3.png

碰撞器和触发器
API

触发信息检测:
1.MonoBehaviour.OnTriggerEnter(Collider collider) 当进入触发器
2.MonoBehaviour.OnTriggerExit(Collider collider) 当退出触发器
3.MonoBehaviour.OnTriggerStay(Collider collider) 当逗留触发器
碰撞信息检测:
1.MonoBehaviour.OnCollisionEnter(Collision collision) 当进入碰撞器
2.MonoBehaviour.OnCollisionExit(Collision collision) 当退出碰撞器
3.MonoBehaviour.OnCollisionStay(Collision collision) 当逗留碰撞器

区别

碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
当IsTrigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果
当IsTrigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果

使用场景

如果既要检测到物体的接触,又不想让碰撞检测影响物体移动;或要检测一个物件是否经过空间中的某个区域时,就可以用到触发器
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果

Tips

Roll a ball 中,当旋转方块没有设置IsTrigger时,应使用OnCollisionEnter,但当碰撞发生时,会先处理碰撞(小球撞停)。当设置了IsTrigger=true时,应使用OnTriggerEnter,当碰撞发生时,小球不会被处理碰撞,而是顺畅通过并拾取


FixedUpdate() 和 Update()
背景和由来

游戏是运行在电脑里的世界,帧是最小时间单位。当只有一种update方法时,如果电脑流畅还行,如果比较卡,导致帧延后了,那么每帧时间就不固定了,就会造成时间间隔不稳定,这会影响世界的真实模拟

区别

FixedUpdate():固定时间间隔执行
Update():时间间隔不固定,取决于电脑性能,以及游戏设置的帧数、显示器刷新率等

使用

FixedUpdate():这里进行世界的模拟运转、以及对采样率有要求的操作,比如给物体施加力,摄像机平滑插值移动等
Update():只用于与显示画面有关的操作,比如移动物体到指定位置


UGUI
渲染顺序

原则:
1.canvas中的控件,严格按照hierarchy中的顺序叠放,排在下面的,叠在最上
2.控件与其他游戏对象的遮挡顺序,严格按照世界坐标中,与相机的距离来渲染

UGUI.png

摄像机抖动
摄像机与移动目标的相对位置抖动

通常抖动是由于,摄像机与被观察物体的相对位置抖动
应当检查摄像机的位置刷新频率,是否与被观察物体的位置刷新频率保持了同步

疑问

如果在Update中调用rigidBody.MovePosition,在Update中移动摄像机,则会抖动;在FixedUpdate中移动摄像机,则不会抖动。怀疑rigidBody.MovePosition只是用于计算刚体碰撞,具体移动操作,是通过被添加到了事件队列中的方式,最终实际在FixedUpdate中pop出来执行更新位置的

解疑

在Update中调用rigidBody.MovePosition,并输出调用前后的位置坐标

code.png

可以看出,调用前后,位置坐标并没有变化

console.png

换在FixedUpdate中调用rigidBody.MovePosition,可看出,位置坐标也没有发生变化

console2.png
结论

上述截图表明,rigidBody.MovePosition函数中,并没有直接改变位置坐标,那么事件队列的猜测,至少是合理的,所以,我认为rigidBody.MovePosition函数应该在FixedUpdate中显示调用,以便直观地让摄像机与之保持一致


transform.position和RigidBody.MovePosition()
背景和由来

父空物体带动子物体旋转,子物体使用RigidBody.MovePosition()进行移动,最终只有移动生效,旋转未生效(父空物体正值旋转,子物体负值旋转,相互抵消)

解决

移动改用transform.position

原因

待续,目测是RigidBody.MovePosition()基于物理,所以阻止了旋转


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 更新:【面试题含答案】http://bbs.9ria.com/thread-288394-1-1.html 高频问...
    好怕怕阅读 10,401评论 3 52
  • 111. [动画系统]如何将其他类型的动画转换成关键帧动画? 动画->点缓存->关键帧 112. [动画]Unit...
    胤醚貔貅阅读 14,543评论 3 89
  • 第一部分 1.请简述值类型与引用类型的区别答:区别: 1.值类型存储在内存栈中,引用类型数据存储在内存堆中,而内存...
    为什么你不觉得幸福啊阅读 3,938评论 0 1
  • 首先要熟悉一些基本的力学名词及相关公式 刚体(Rigidbody):刚体是指在运动中和受到力的作用后,形状和大小不...
    FLY旳影子阅读 14,104评论 0 11
  • 第一步:安装node和npm 不用说,要用gulp,得先安装node和npm(安装完node后,自带有npm) 第...
    星球小霸王阅读 3,826评论 1 2

友情链接更多精彩内容