本文共 5521 字,大约阅读时间需要 18 分钟。
Unity3D小功能 小技巧 小教程 小原理(持续更新...)
1.Unity的.NET版本是2.0
按道理来说,C#能用的功能Unity也能用,但是Unity的.NET却不是最新版
要是用一些别的DLL或者接入SDK的时候有DLL,就会发现有一些DLL的.NET版本是4.0,Unity便无法使用这些DLL,相当困扰。
2.关闭Request error提示 Edit→Preferences→General→Show Asset Store search hits
3.设置物体物理互不碰撞
Edit-Project Settings-Physics 打开物理管理器(Physics Manager)
里面可以设置层级相互间的碰撞
4.进度条
通过改变UI的FillAmount值
public UnityEngine.UI.Image healthBar;
void Start() {healthBar.fillAmount = 0.0f;}
5.Unity连接多媒体SDK开发
体感:Kinect、Leapmotion
AR:Vuforia Metiao EasyAR VoidAR
VR:gear 暴风 oculus HTC
触屏: Input.Touch EasyTouch(插件)
7.Inspector面板修改
例如添加一个按钮:
[CustomEditor(typeof(出现按钮的脚本名)), CanEditMultipleObjects]
public class 自定脚本名: Editor {public override void OnInspectorGUI(){
base.OnInspectorGUI();//绘制原本的信息//if(GUILayout.Button("自定义按钮名字")){ 方法函数();}}}8.平台预处理
#if UNITY_EDITOR
platform = "hi,大家好,我是在unity编辑模式下"; #elif UNITY_XBOX360 platform="hi,大家好,我在XBOX360平台"; #elif UNITY_IPHONE platform="hi,大家好,我是IPHONE平台"; #elif UNITY_ANDROID platform="hi,大家好,我是ANDROID平台"; #elif UNITY_STANDALONE_OSX platform="hi,大家好,我是OSX平台"; #elif UNITY_STANDALONE_WIN platform="hi,大家好,我是Windows平台"; #endif Debug.Log("Current Platform:" + platform);9.加载Resources
GameObject instance = Resources.Load("资源名字") as GameObject;
GameObject cube = Instantiate(instance) as GameObject;cube.transform.position = this.transform.position;10.Only one exe只允许打开一个程序
int count=Process.GetProcessesByName(Process.GetCurrentProcess().ProcessName).Length ;
if (count> 1){// MessageBox.Show(count.ToString());调试使用//杀掉当前Process.GetCurrentProcess().Kill();}11.物体de 旋转 and 位移
旋转:
(瞬间)transform.localRotation = Quaternion.Euler(new Vector3(x,y,z));
(缓慢)transform.rotation = Quaternion.Slerp( a , b , t );
位移
(速度相关) transform.position=Vector3.MoveTowards(transform.position,tempUpdatePos,Time.deltaTimeDisShakeThreshold);(固定时间)this.transform.Translate(Vector3.normalize(目标位置-自身位置) (Vector3.Distance(自身位置, 目标位置)/(所用时间 * Time.deltime)));
2d 向某方向移动
moveDirection = mTarget.transform.position - mSelf.transform.position;
moveDirection.Normalize();
float target = Mathf.Atan2(moveDirection.y, moveDirection.x) Mathf.Rad2Deg - 90f;mSelf.transform.rotation = Quaternion.Slerp(mSelf.transform.rotation, Quaternion.Euler(0, 0, target), turnSpeed Time.deltaTime);_controller.SetForce(speedX,speedY));6.改变鼠标位置和隐藏鼠标
using System.Runtime.InteropServices;
[DllImport("user32.dll")]
public static extern int SetCursorPos(int x, int y);
Void XX(){ SetCursorPos(0, 0); }
[DllImport("user32.dll")]
public static extern int SetCursorPos(int x, int y); void Start () { //隐藏Cursor.visible = false;}17.控制全局音量
通过 AudioListener.volume = *;来控制场景场景音量
AudioListener.volume = *; AudioListener.volume = *;
18.UGUI
对于Text 使用材质和Outline可以制作出艺术字体
Mask可以遮掩 对于制作一些动画比较好
19.鼠标点击设置UI位置(不同分辨率设置有不同 此处实例为1920*1080 可在调试模式下使用)
GetComponent<Animator>().SetTrigger("Clip");
// 获取目标对象当前的世界坐标系位置,并将其转换为屏幕坐标系的点Vector3 Pos = Camera.main.WorldToScreenPoint(transform.position);// 设置鼠标的屏幕坐标向量,用上面获得的Pos的z轴数据作为鼠标的z轴数据,使鼠标坐标与目标对象坐标处于同一层面上Vector3 mousePos = new Vector3(Input.mousePosition.x(1920.0f/(float)Screen.width) - 1920/2, Input.mousePosition.y(1080f/(float)Screen.height) - 1080/2,Pos.z);//先乘一个GameView折扣(GameView要设置为1920*1080) 然后减去中心点的差值Debug.Log(mousePos.ToString());transform.position = mousePos;20.使用AssetsBundle压缩文件有奇效
首先制作一个空项目,加入AB代码后,导出有28M
然后我是使用了一组72帧的动画,这组动画大约有4M
众所周知,unity对2D Sprite格式处理会使图片很大,由原本的图片大小67k变到了Unity里的1m一张
然后我把动画加到了UGUI里 然后导出,震惊的94M总共
最后使用AB压缩,观察压缩的文件,最大的image里就2M
比原图还要小
导出结果当然也小
AB真是太好用了 建议独立物件都用AB
21.重置动画(播放动画第一帧)
firstAnimName = GetComponent<Animator>().GetCurrentAnimatorClipInfo(0)[0].clip.name;
GetComponent<Animator>().Play (firstAnimName,-1,0);22.Mono中文乱码
【Tools】-->【Option】, 然后选择【Fonts】,双击【Text Editor】,选择【Monospace】字体 Normal 10
23.uLua使用方法
注意AppConst里的LuaBundleModel变量,如果想使用AssetBundle模式,该值置为true,但是每次修改lua代码,需要执行菜单栏上的LuaFramework->Build XXX Resource,将lua资源打包,否则,你修改的lua逻辑不会更新并执行。
如果LuaBundleModel置为false,则lua代码会时时更新。
此外,修改C#代码,一定不要忘了执行菜单Lua->Clear wrap files,然后重新生成Gen Wrap + Binder
确定逻辑无误后,注册C#类,打开"CustomSettings.cs",注册我们的类。"_GT(typeof(XXXXXX)),"。最后,执行上面第2步的Lua->Clear wrap files,Gen Wrap + Binder。此时,会生成一个叫MyHelloWorldWrap.cs的文件,在Assets\LuaFramework\ToLua\Source\Generate目录下,其实所有在CustomSettings中注册的C#类都会生成Wrap文件,保存在该目录下。
24.使用VS作为C#编辑器
vs可以断点调试和为Unity提供的便捷简直不要太好
下载VS Tool for unity即可断点调试 (选择相应VS版本) 地址:
但是vs的快捷键蛋疼得很,--修改快捷键ctrl+w关闭当前窗口的方法:
编译器相关 如果使用Vs的 #region 和 #endregion 用于代码的隐藏缩放,对于项目代码管理,相当好用。Mono也有缩放模式,有点碍眼..
一个C#的API 可以用于打开一个网页..应用..或者进程..或者控制面板内的功能..例如打印..
public void PrintFile(){
System.Diagnostics.Process process = new System.Diagnostics.Process(); //系统进程
process.StartInfo.CreateNoWindow = false; //不显示调用程序窗口
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;//
process.StartInfo.UseShellExecute = true; //采用操作系统自动识别模式
process.StartInfo.FileName=path; //要打印的文件路径
process.StartInfo.Verb="print"; //指定执行的动作,打印:print打开:open…………
process.Start(); //开始打印}
5.Unity加载图片动画(动画比较多的情况)
(1.UnityAnimation播放,直接全选png序列帧图(卡超级久) 然后拖到面板上(卡很久),会自动生成序列播放的animator。但我发现超过300图之后有可能会出现不明报错(大概因为输出问题),1k张感觉就没什么希望了,最重要的是在unity里1080p的图转成sprite,都会变成10m一张,导致项目发布之后更是奇大无比。
(2.播放mov,可以尝试播带透明通道的mov,但需要一个shader,具体我不会写,在网上找到的也不太好用,各种问题(抠色会失真和有噪点,提取透明or黑白遮罩会出现不同步)。(3.Load的方法,unity有3种。(需要在start前预先加载完,不要一边播一边加载会卡的。)① LoadPrefab,不考虑。②LoadResources,先load资源文件夹内的,然后播放。目前测试超过700张Unity会迷之不加载,估计是load的东西太大。③LoadAssets。因为是一张张地load,不会出现太大而不加载的问题。目前使用这个办法播放④AB加载
25.远程Mac鸡可以使用vnc viewer连接 ,Cornerstone作为项目管理
26.求向量夹角
向量 = 目标位置 - 共同起点位置
v3.angle(向量A,向量B)
转载于:https://blog.51cto.com/14058389/2313023