命令

  • identify
    按一定格式输出图片大小:gm identify -format '%w %h' a.png
  • resize
    缩放图片,可使用-filter指定缩放算法。不同缩放算法生成的图片质量不同。
    resize 默认使用lanczos算法
    gm mogrify -resize 100x100 -filter Lanczos a.png
    filter

参考链接

相关插件

杂项

  • Android版只支持GearVR,并不支持其它设备,如果要使用Cardboard,必须使用Cardboard插件

FAQ

  1. 官方Demo VR Samples 1.1.1在切到Android平台后,启用VR支持报错:

    1
    EditorOnlyPlayerSettings property Android::VR::enable not inititalized. Please initialize it using corresponding PlayerSettings.InitializeProperty function

    原因:没有安装对应版本的Android SDK平台工具,另外不能切到Android5.0以下的SDK版本,会崩溃,官方也说明了,目前只支持安卓5.0以上。

图形性能分析

  • 面数 Batches
  • 最影响效率的是角色
  • 面数高并不可怕,可怕是Batch多
  • 如果发现渲染性能有问题,可以用排除法,就是把场景里的东西一点一点删掉,看看是什么影响了性能。

MeshBaker非常好用

  • 200M内的模型合一起没什么问题

内存优化

工具

memoryprofiler

Unity5.3新Memory Profiler

(Unity) 为被 Lua 隔断的 C# 实现添加 Profiler 支持

图片内存优化

Unity3D的图片占用内存是原图片的2倍

参考

骨骼动画与蒙皮优化

性能拖后腿的大户们

  • 摄像机滤镜

主要的类

IBehaviorScheduler

BehaviorScheduler

  • 驱动PlayerActionExecutor,PlayerAIExecutor,BallActionExecutor,CoachSkillEventConsumer,MatchEventConsumer的Update,LateUpdate,FixedUpdate

    PlayerActionExecutor

  • 每个队员身上都会挂一个该脚本,并在Start()中,向GameHub注册自己
  • 驱动:BallActionHandler,PlayerStateHandler,PlayerTransformHandler,ExtraTimeActionExecutor
  • PlayerStateHandler
    1. 持有ActionBuffer
    2. 触发NotifyNewActionStart事件
    3. 有三态
      • Stop 当前没有动作运行中
      • Running 当前有动作在运行中,此状态下,如果发现需中断,则查看自身动作是否为休闲状态或者动画是否播完,如果满足则响应中断。
      • TakeOverByOthers 受到外部中断指令,指示现在角色动作由外部接管,不再产生自主行为
  • IKHandler
    1. 控制守门员救球时的反向动力学
    2. 主要方法:OnNewSaveActionStart
  • BallActionHandler
    1. 用来响应击球事件,并产生相应动作交与BallActionExcutor
    2. 输入为Action(Player动作),输出为BallAction(BallActionExutor动作)

      PlayerAIExecutor

  • 每个队员身上都会挂一个该脚本,并在Start()中,向GameHub注册自己
  • 主要工作交给PlayerHeadHandler和PlayerUpperBodyHandler来做
  • PlayerHeadHandler
  • PlayerUpperBodyHandler

    BallActionExecutor

  • 控制球动作
  • BallActionHandler 用来响应击球事件,并产生相应动作交与BallActionExcutor。每个队员身上都有一个BallActionHandler。
  • 这个组件是挂在球上面的
    -

    CoachSkillEventConsumer

    MatchEventConsumer

    TeamStateManager

    GameHub

  1. 拥有双方队员的Animator组件
  2. 动作与AI调度器
  3. Start()-> 发出 onMatchStart 事件
  4. RegisterPlayerAIExecutor 注册PlayerAIExecutor
  5. RegisterPlayer 注册队员的Transform,Animator及ActionExecutor
  6. RegisterPlayerAIExecutor 注册PlayerAIExcutor
  7. 作用:
    • 管理比赛过程,比如比赛开始流程
    • 驱动BehaviorScheduler
    • HandleMatchEvent 广播比赛特殊事件,如比赛开始,开球,比赛结束等
    • 管理队员

      Action

      DottedLine 划线击球射门

      AthleteLabels 头顶板

      TimeLine 时间控制,暂停,运行,挂起

  8. 冻结队员动作的实现方法:设置所有队员的动画组件的speed属性为0
  9. 挂起会冻结队员动作,挂起结束后会解冻队员,并恢复上一个时间状态
  10. 暂停

    • TLUnfreeze()与TLFreeze()
    • 还会更新当前时间,但使用TLMatchTime()将得到暂停的起始时刻,其它状态下,该方法得到的是当前时间
  11. 系统级暂停,StopTimeProceed()与ResumeTimeProceed(),对Time.timeScale进行设置

DataProvider

  • 提供比赛事件存储队列matchKeyFrameQueue
    此队列中的事件由MatchEventConsumer单例处理,MatchEventConsumer调用GameHub的HandleMatchEvent将事件广播给所有的队员
    比赛特殊事件,比如开球,正常比赛,点球,罚球,比赛结束等

一些约定

  • 双方队员编号,0-10,11-21
  • 0与11是守门员

配置文件

  • Assets/CapstonesRes/Game/Config => /res/res_Game_Config/CAB-res_Game_Config
  • # 开头的是注释
  • 一行一条记录
  • ActionAttributes.txt

    • 作用:每个动作的长度,及触球相关参数
    • 加载类:ActionAttributeLoader 用于解析动画相关属性,并提供Get接口
    • 按#分隔字段
    • 第一行为字段名字
      clip_name clip_offset clip_duration clip_rotation ( first_touch_ball_offset first_touch_ball_duration first_touch_ball_player_offset last_touch_ball_offset last_touch_ball_duration )
      • clip_offset 是Vector3
      • clip_rotation 是Vector4
    • 前四个字段是必须的,数据项要么是4个字段的,要么是9个字段的,其它数量的字段都是非法数据项
    • clip_name的第一个字母是用意义的
      • 3_1, A-Z 并且不是A01或T
  • ActionConfig.txt

    • 作用:逻辑动作对应的动画,是一对多的关系
    • 加载类:ActionConfig
    • 两个字段
      • 第一个字段是逻辑动作名字
      • 第二个字段是具体动画名字,相应的动画在ActionAttribute中都有配置,以,分隔
  • PlayerAction, PlayerTransform

    • PlayerAction作用:每个Player自已所能做的动作 ?
    • PlayerTransfrom
      • 作用:每个Player的初始位置与面向
      • 所有数据都在一行上,记录以#分隔,记录内以;分隔,每条记录有3项
    • 加载类:PlayerActionLoader
  • ActionMergeInfo

    • 作用:动作混合
    • 三个字段
      • 动作状态
      • 条件

AI中Lua部分

  • 估计是用行为树
  • AI脚本位置:zcfy/spt/emulator
    -

Unity3D 5光照系统

参考链接

Unity 5 Lighting Cookbook

光照图

GI流程

Lighting界面下的烘焙参数

  1. Object->Scale In Lightmap 物体接受的阴影是PixelPerUnit(Scene)设置的多少倍。
  2. Scene->Bake Resolution 每个世界单位(1米)对应LightMap中多少个像素,一般5就可以了。

##FAQ

  1. 阴影太淡
    原因是地表太大,一张光照图的大小是有限的,地表太大,会使得每个世界单位对应光照图上的像素变少,所以光照图贴到地表上后,一经放大,阴影就会非常模糊非常淡。解决的办法是分割
    ,将重点区域的地表对应的Scale In Lightmap的值调大,非重点区域的物体及地表Scale In Lightmap值调小。

  1. LightingData.asset文件非常大,达到MB数量级,使得打包出来的场景AssetBundle很大
    原因是在烘焙时勾选了PreComputed RealTime GI
  2. 无法从AB加载完整的光照图。
    • 原因1:打包出现问题,可以试着将场景打成一个AB包。
    • 原因2:SVN更新出现问题,可以将SVN本地目录删除,重新更新。

参考链接