简单写写,做个备忘,以后还要经常改改。
1. 操作
PC上控制角色操作可以用Standard Assets --> Character --> First Person Character --> Prefabs --> FPSController ,FPSController下面挂载角色。若要改到安卓上,需要用到Standard Assets --> CrossPlatformInput --> Prefabs中的几个预设的控制界面,然后在Hierarchy中加入一个空的UI --> Event System即可。另外,可能这个版本的Standard Asset又问题(当前用的是5.0),如果CrossPlatformInput中的控制有问题,需要修改该控制界面中的脚本,把OnEnable函数名改为Start。
CrossPlatformInput中的操作方式如果不能满足要求,可以用EasyTouch插件自己制作操作界面,EasyTouch中自带预设好的,使用方法可以参考http://www.tuicool.com/articles/2Ebiy2j 中介绍的方法。另外如果需要结合Standard Assets中的FPSController,需要修改FPSController的First Person Controlller脚本文件,将RotateVIew中的内容全部注释掉,去掉FPSController绑定鼠标旋转视角的约束,然后再结合EasyTouch使用。
2. 界面阴影
在PC上运行正常后,可能会出现在安卓机上运行没有阴影的情况,此时可以按照下面的方法解决。
Android平台下不显示阴影,
1.把Edit-GraphicsEmulation-NoEmulation勾上,
2.出apk包时最好能把playersetting-GraphicsLevel改为force OpenGL ES 3.0 ,不改部分手机也能有阴影
3.qualitysetting-shadowdistance要合适
4.camera离阴影的物理距离不能太远
5.fast、fastest下没有阴影
6.光源要hardshadow或者softshadow,有些硬件不支持softshadow
7.投射物体材质球要cast shadow,接收物体要receiveshadow勾上原帖地址:http://www.ceeger.com/forum/read.php?tid=18682
其中第5条中的fast和fastest是指Edit --> Project Settings --> Quality中的默认画质类别
其中各类详细解释可以参考 https://software.intel.com/zh-cn/articles/how-to-plan-optimizations-with-unity/?utm_source=优快云.com&utm_medium=Text%20Link&utm_campaign=GameDev_PRC_Q215_优快云
点击Levels中的名称可以在下面查看和修改该画质级别下的各类设定,一般将Default设为Simple就可以产生阴影。然而一旦开启阴影,可能带来的问题是游戏在低端安卓上运行帧数过低(30帧是底线了),然后会带来下面一个问题:优化。
3. 优化
网上关于Unity工程优化的帖子很多,优化方法也比较多,但总的原则不变,从优先级从高到低可总结为:
(1)代码优化:尽量减少Instantiate等图形加载新建等调用,非常消耗运算和内存。此外还有一些代码优化常识,比如循环优化等等。
(2)模型优化:减少场景中次要模型的顶点数,贴图大小,资源打包,模型动画优化等,如果没有必要不要开启接收阴影(Receive Shadows)和产生阴影(Cast Shadows)等。本次开发模型部分优化主要有一下两个部分:一是把不必要的模型去掉了产生阴影或接受阴影。二是修改模型的Shader,有些Shader比如带透明效果等比较耗费运算和内存,可以试试改成别的。
(3)Quality调节:根据各项参数的作用调节。本次开发把Rendering和Other调节的较高(这两项不怎么影响帧数),把Shadows中的内容改成了如下样子:
效果还不错,因为本次开发影响帧数的主要是阴影,在修改了所有模型的阴影参数和Quality的Shadows后,帧数可以达到50左右。
(4)其他优化:不足的可以在查查其他帖子。。。
大概就总结到这里,以后再添加 :D
附录
附上显示帧数的代码,直接挂在场景中的一个空Object上:
using UnityEngine;
using System.Collections;
public class FPS : MonoBehaviour {
private float lastTime;
private float timeInterval;
private float fps;
private int frames;
// Use this for initialization
void Start () {
lastTime = Time.realtimeSinceStartup;
timeInterval = 0.5f;
frames = 0;
}
// Update is called once per frame
void Update () {
++frames;
float nowTime = Time.realtimeSinceStartup;
if (nowTime >= lastTime + timeInterval)
{
fps = frames / (nowTime - lastTime);
frames = 0;
lastTime = nowTime;
}
}
void OnGUI()
{
GUILayout.Label("FPS: " + fps.ToString("f2"));
}
}