1. 对象的查找

unity使用手记

  1. Transform查找
    GameObject root = GameObject.Find(“Canvas”);
    GameObject go = root.transform.Find(“HDLG”).gameObject;
    go.SetActive(true);

  2. GameObject.Find查找(此方法无法查找隐藏的对象)
    GameObject.Find ("/Canvas/UI").SetActive(false); //////按照路径的方式查找的

  3. 标记查找(此方法无法查找隐藏的对象)

unity使用手记
GameObject.FindGameObjectWithTag(“HGDLG”).SetActive(false); ;
4) 返回点击物体名称
UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject
2. 修改文本内容
unity使用手记
GameObject.Find(“飞机”).GetComponent().player.GetComponent().Play(“wait”); /////停止飞行
starts.transform.Find(“Text”).GetComponent().text = “启动”;

  1. Awake的使用方法

必须将这个脚本放在上一个节点的对象上方可初始化成功
unity使用手记

  1. 字符String常见用法
    1.)、Length:获得当前字符串中字符的个数
    2)、ToUpper():将字符转换成大写形式
    3)、ToLower():将字符串转换成小写形式
    4)、Equals(lessonTwo,StringComparison.OrdinalIgnoreCase):比较两个字符串,可以忽略大小写
    5)、Split():分割字符串,返回字符串类型的数组。
    6)、Substring():解决字符串。在截取的时候包含要截取的那个位置。
    7)、IndexOf():判断某个字符串在字符串中第一次出现的位置,如果没有返回-1、值类型和引用类型在内存上存储的地方不一样。
    8)、LastIndexOf():判断某个字符串在字符串中最后一次出现的位置,如果没有同样返回-1
    9)、StartsWith():判断以…开始
    10)、EndsWith():判断以…结束
    11)、Replace():将字符串中某个字符串替换成一个新的字符串
    12)、Contains():判断某个字符串是否包含指定的字符串
    13)、Trim():去掉字符串中前后的空格
    14)、TrimEnd():去掉字符串中结尾的空格
    15)、TrimStart():去掉字符串中前面的空格
    16)、string.IsNullOrEmpty():判断一个字符串是否为空或者为null
    17)、string.Join():将数组按照指定的字符串连接,返回一个字符串。

  2. 文件及文件夹操作- File类、Directory 类、FileInfo 类、DirectoryInfo 类
    文件及文件夹操作:
    C/S:WinForm可以操作客户端文件 Client Server
    B/S:Brower Server
    命名空间:using system .IO;

  3. File类:
    创建:File.Create(路径);创建文件,返回FileStream
    FileStream fs = File.Create(路径);之后需要关闭否则打不开,fs.close();
    删除:File.Delete(路径);无返回值
    复制文件:File.Copy(源文件,目标文件);
    剪切文件:File.Move(源文件路径,目标路径);
    判断文件是否存在:File.Exists(路径);返回布尔型,true代表已存在
    文件加密:File.Encrypt();File.Decrypt();解密
    File.GetCreationTime(路径);获取创建时间,返回DateTime类型 SetCreationTime(路径,DateTime类型);修改创建时间
    File.GetLastAccessTime(路径);最后访问时间,返回DateTime类型 SetLastAccessTime(路径,DateTime类型);修改访问时间
    File.GetLastWriteTime(路径);最后修改时间,返回DateTime类型 SetLastWriteTime(路径,DateTime类型);修改修改时间

  4. Directory 类,目录(文件夹)
    Directory .CreateDirectory(路径);创建目录
    Directory .Delete(路径);删除目录
    Directory .Exists(路径);目录是否存在
    三个时间的get和set
    Directory .GetDirectories(路径); 获取子目录,返回string数组
    Directory .GetFiles(路径); 获取子文件!名!,返回string数组,string[] s = Directory .GetFiles(路径);
    Directory .GetDirectoryRoot(路径); 获取根目录
    Directory .GetParent(路径); 获取上一级目录


FileInfo 类
是实例方法,需要造对象new出来才能用,上面的都是File的静态方法
创建文件:FileInfo f = new FileInfo(路径); FileStream s = f.Create(); s.Close();
删除文件:FileInfo f = new FileInfo(路径); f.Delete();
复制文件:FileInfo f = new FileInfo(路径); f.CopyTo(目标路径,是否覆盖(true是覆盖));
移动文件:FileInfo f = new FileInfo(路径); f.MoveTo(目标路径);
文件是否存在:FileInfo f = new FileInfo(路径); bool b = f.Exists;布尔型,是个属性
获取文件名:FileInfo f = new FileInfo(路径);string s = f.FullName;属性,带路径的文件名
获得创建时间:DateTime d = f.CreationTime,三个时间都一样,都是属性
设置创建时间:f.CreationTime = DateTime.Now.AddDays(100); 三个都一样
获取文件大小:f.Length

DirectoryInfo 类
创建目录:DirectoryInfo d = new DirectoryInfo(路径); d.Create();
删除目录:d.Delete();
移动目录:d.MoveTo(目标路径);
目录是否存在:bool b = d.Exists;
获得目录全名:d.FullName;
获得子文件!对象信息!: FileInfo[] f = d.GetFiles(); 返回的是文件对象数组,内容更详细,d.GetFiles("*.exe")只获取exe的文件
获得子目录:DirectoryInfo[] dr = d.GetDirectories();
实例展示:读取目录大小
private long size = 0;
private long DirSize(string path)
{
DirectoryInfo d = new DirectoryInfo(path);
FileInfo[] f = d.GetFiles();
foreach (FileInfo wj in f)
{
size += wj.Length;
}
DirectoryInfo[] dr = d.GetDirectories();
if (dr.Count() > 0)
{
foreach (DirectoryInfo wjj in dr)
{
DirSize(wjj.FullName);
}
}
return size;
}
读取目录下面文件夹数量:
private int dcount = 0;
private int DirCount(string path)
{
DirectoryInfo d = new DirectoryInfo(path);

DirectoryInfo[] dr = d.GetDirectories();
if (dr.Count() > 0)
{
foreach (DirectoryInfo wjj in dr)
{
DirCount(wjj.FullName);
}
}
dcount += dr.Count();
return dcount;
}
读取所有文件数量:
private int count=0;
private int FileCount(string path)
{
DirectoryInfo d = new DirectoryInfo(path);
FileInfo[] f = d.GetFiles();
DirectoryInfo[] dr = d.GetDirectories();
if (dr.Count() > 0)
{
foreach (DirectoryInfo wjj in dr)
{
FileCount(wjj.FullName);
}
}
count += f.Count();
return count;
}
利用遍历集合查询文件夹下所有文件数量,文件夹数量:
private int fcount = 0;
private int FileCount(string path)
{
//造文件夹信息对象
DirectoryInfo dwjj = new DirectoryInfo(path);
//取当前文件夹下文件数量
fcount += dwjj.GetFiles().Length;
//取当前目录下所有文件夹
foreach (DirectoryInfo d in dwjj.GetDirectories())
{
FileCount(d.FullName);
}
return fcount;

}
private int dcount = 0;
private int DirCount(string path)
{
//造一个文件夹信息对象
DirectoryInfo d = new DirectoryInfo(path);
//取该目录下所有文件夹
DirectoryInfo[] df = d.GetDirectories();
//累加文件夹数量
dcount += df.Length;
//遍历所有文件夹
foreach (DirectoryInfo w in df)
{
DirCount(w.FullName);
}
return dcount;
}
6. Broadcast Messages-------------------->
是否启动Unity里面的SendMessage的机制,不熟悉这个的童鞋自己研究,其实也蛮好理解的。

就是向同级发送消息,在这个游戏物体上的所有MonoBehaviour上调用名称为methodName的方法,比如在Test1.cs脚本里面,我们有一个方法:

1
2
3
4 getMessage(string str)
{
print(“receive message:”+str);//打印收到的消息
}
  然后在Test2.cs里面,我们调用
1
2 string s = “send message”;
SendMessage(“getMessage”,s);
  运行就会收到消息。
7. 添加arcore后相机无法截图
unity使用手记
如上图所示,主要是相机类型不设置的不一致引起的,修改成一致即可

  1. 脚本无法添加到对象上

unity使用手记
unity使用手记
类名称必须和文件名称保持一致
9. Pico库使用经验
unity使用手记

需要添加
unity使用手记
unity使用手记

关键的内容是去掉unity使用手记 事件处理相应

  1. 相机截屏卡顿设置
    unity使用手记
    将两项勾选去掉即可

  2. shader实现底部渲染效果
    unity使用手记
    将材质的渲染方式修改成上图模式。
    1D91D4 CFCFCF

  3. 截图内存暴增的问题
    unity使用手记
    最后发现上面的代码中去掉红框中的内容即可正常了

  4. Dotween中动画暂时无效的情况
    unity使用手记
    播放部分调用了命令形式启动动画播放,后期再进行暂停等操作的时候应该同样带上path.transform.DOPause()而不能自己调用path.DOPause(),否则无效

  5. 将工程编译到移动设备后发现视图卡顿甚至有彩条出现的情况
    考虑是否有较多的相机是否处于**并且在不停的渲染,这样的情况很有可能会引起视图卡顿现象。

  6. SceneManager.LoadScene加载后返回发现很多值为恢复初值状态
    这样的情况很有可能是因为大量的变量初值被定义在了申明的地方,如下图所示
    unity使用手记

  7. CommandInvokationFailure: Unable to convert classes into dex format
    unity使用手记
    editLog文件中记录内容如下:
    unity使用手记
    解决方式:
    unity使用手记
    将plugins下android下的Pico_PaymentSDK_Android_V1.0.22.jar文件删除掉即可正常编译apk文件。

  8. Editor Log查看
    unity使用手记

  9. 数组和list互换
    //list转到数组
    int[] array = list.ToArray();
    //数组转到list
    List list2 = new List(array);

  10. 运行帧率修改
    在Quality(质量)设置里把帧数设定关闭 unity使用手记之后才能在代码中修改游戏运行的帧数

//修改当前的FPS
Application.targetFrameRate = 30;
20. 判断对象是否被隐藏

if (DSM3.activeInHierarchy == false)
{
lcmr.GetComponent().enabled = false;
rcmr.GetComponent().enabled = false;
}

  1. RequireComponent的使用:
    当你添加的一个用了RequireComponent组件的脚本,需要的组件将会自动被添加到game object(游戏物体)。这个可以有效的避免组装错误。举个例子一个脚本可能需要刚体总是被添加在相同的game object(游戏物体)上。用RequireComponent属性的话,这个过程将被自动完成,因此你可以永远不会犯组装错误。

  2. AddComponentMenu的使用:
    AddComponentMenu属性允许你在"Component"菜单中放置一个无论在哪的脚本,而不是仅仅在"Component->Scripts"菜单中。
    用法:[AddComponentMenu(“NGUI/Examples/cubSpin”)]
    unity使用手记

  3. MenuItem的使用:
    在工具栏上增加新的一列
    用法:如图[MenuItem(“Test/Test”)] 后面必须跟一个static的方法,需要引用头文件 using UnityEditor;:
    unity使用手记
    unity使用手记

  4. ContextMenu的使用:
    属性允许你去添加命令给上下文菜单
    用法:
    [ContextMenu(“Test”)]
    public void Test ()
    右键点击:会出现如图所示
    unity使用手记

  5. HideInInspector的使用:
    在Inspector面板中隐藏public变量
    用法:
    [HideInInspector]
    public Vector3 rotationsPerSecond = new Vector3(0f,0.1f,0f);
    使用前如图
    unity使用手记
    使用后;如图所示
    unity使用手记)

  6. Curved UI 使用
    unity使用手记
    在canvas面板中添加curved UI raycaster 、 curved UI settings(设置为custom_ray)
    unity使用手记
    如果使用的是pico等手柄的话需要将PVR_UI Canvas 脚本勾选,每次都会被强制取消。造成无法正常使用手柄操作。

  7. 相机显示顺序
    unity使用手记
    可以通过修改相机的深度来控制相机的显示渲染顺序,特别是多相机的情况下ui相机需要最后渲染才可以正常显示UI相机的内容。

  8. 射线点击响应函数

Unity3D的uGUI系统的将UI可能触发的事件分为12个类型,即EventTriggerType枚举的12个值。如下图所示:
unity使用手记
先以PointerClick为例。这个是用于某点点击事件。其他事件都可以根据相同的办法调用。
之所以使用PointerClick为例。是因为在最后笔者会提到一个特殊的实现方式。而相比于其他事件类型,有且仅有Click事件存在特殊实现。
29. NetworkManager对象数据同步
如果需要将客户端数据同步到服务器上需要将数据在做本地运行判断前更新数据,否则不需要如下所示:
unity使用手记
调用数据顺序也需要注意到
服务器调用客户端代码 客户端调用服务器上代码
unity使用手记
30. NetworkManager关键字段

[SyncVar] 用于标识序列化变量,实现变量同步 例: (把Hp标识,就可以实现同步减血)
[Client] 表示只能在客户端调用
[ClientCallBack] 表示客户端执行的回调
[Command] 表示客户端向服务端发送的命令,在服务端执行
[ClientPrc] 表示服务端向客户端发送的命令,在客户端执行
[ClientRpc] //由服务器端调用,在客户端执行

  • isServer – true 如果物体是在服务器(或伺服器)上而且已经被派生出来;
  • isClient – true 如果物体是在客户端上,而且已经在服务器上被创建;
  • isLocalPlayer – ture 如果物体是当前客户端的玩家对象
  • isAuthority – true 如果物体的拥有者是本地进程
    同步列表(SyncLists)
    同步列表类似于同步变量,但是他们是一些值的列表而不是单个值。同步列表和同步变量都包含在初始的状态更新里。同步列表不需要[SyncVar]属性标识,他们是特殊的类。内建的基础类型属性列表有:
    SyncListString
    SyncListFloat
    SyncListInt
    SyncListUInt
    SyncListBool
  1. SyncVar的使用
    //成员变量通过[SyncVar]标签被配置成同步的变量
    //同步变量可以是基础类型,如整数,字符串和浮点数。
    //也可以是Unity内置数据类型,如Vector3和用户自定义的结构体,
    //但是对结构体类型的同步变量,如果只有几个字段的数值有变化,整个结构体都会被发送。
    //每个NetworkBehaviour脚本可以有最多32个同步变量,包括同步列表
    [SyncVar]
    int num3;

    //当同步变量有变化时,服务器会自动发送他们的最新数据。不需要手工为同步变量设置任何的脏数据标志位。
    //注意在属性设置函数中设置一个同步变量的值不会使他的脏数据标志被设置。如果这样做的话,
    //会得到一个编译期的警告。因为同步变量使用他们自己内部的标识记录脏数据状态,在属性设置函数中设置脏位会引起递归调用问题。

    //同步变量还可以指定函数,使用hook;
    //当服务器改变了playerHP的值,客户端会调用ChangHP这个函数
    //这个值是以服务器为准。就算客户端改变了,服务器改变之后,客户端还是显示服务器的数据
    [SyncVar(hook = “ChangHP”)]
    public int playerHP = 100;

    public void ChangHP(int newHP)
    {
    playerHP = newHP;
    }

相关文章: