unity使用手记

  1. 对象的查找

在这里插入图片描述

  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. 标记查找(此方法无法查找隐藏的对象)

在这里插入图片描述
GameObject.FindGameObjectWithTag(“HGDLG”).SetActive(false); ;
4) 返回点击物体名称
UnityEngine.EventSystems.EventSystem.current.currentSelectedGameObject
2. 修改文本内容
在这里插入图片描述
GameObject.Find(“飞机”).GetComponent().player.GetComponent().Play(“wait”); /停止飞行
starts.transform.Find(“Text”).GetComponent ().text = “启动”;

  1. Awake的使用方法

必须将这个脚本放在上一个节点的对象上方可初始化成功
在这里插入图片描述

  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后相机无法截图
在这里插入图片描述
如上图所示,主要是相机类型不设置的不一致引起的,修改成一致即可

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

在这里插入图片描述
在这里插入图片描述
类名称必须和文件名称保持一致
9. Pico库使用经验
在这里插入图片描述

需要添加
在这里插入图片描述
在这里插入图片描述

关键的内容是去掉在这里插入图片描述 事件处理相应

  1. 相机截屏卡顿设置
    在这里插入图片描述
    将两项勾选去掉即可

  2. shader实现底部渲染效果
    在这里插入图片描述
    将材质的渲染方式修改成上图模式。
    1D91D4 CFCFCF

  3. 截图内存暴增的问题
    在这里插入图片描述
    最后发现上面的代码中去掉红框中的内容即可正常了

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

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

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

  7. CommandInvokationFailure: Unable to convert classes into dex format
    在这里插入图片描述
    editLog文件中记录内容如下:
    在这里插入图片描述
    解决方式:
    在这里插入图片描述
    将plugins下android下的Pico_PaymentSDK_Android_V1.0.22.jar文件删除掉即可正常编译apk文件。

  8. Editor Log查看
    在这里插入图片描述

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

  10. 运行帧率修改
    在Quality(质量)设置里把帧数设定关闭 在这里插入图片描述之后才能在代码中修改游戏运行的帧数

//修改当前的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”)]
    在这里插入图片描述

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

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

  5. HideInInspector的使用:
    在Inspector面板中隐藏public变量
    用法:
    [HideInInspector]
    public Vector3 rotationsPerSecond = new Vector3(0f,0.1f,0f);
    使用前如图
    在这里插入图片描述
    使用后;如图所示
    在这里插入图片描述)

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

  7. 相机显示顺序
    在这里插入图片描述
    可以通过修改相机的深度来控制相机的显示渲染顺序,特别是多相机的情况下ui相机需要最后渲染才可以正常显示UI相机的内容。

  8. 射线点击响应函数

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

  2. 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;
    }

  3. SyncListStruct使用
    申明一个结构体
    public struct Buf
    {
    public int id;
    public string name;
    public float timer;
    };
    在申明变量的地方初始对象
    public class SyncListBuf : SyncListStruct { }
    public SyncListBuf m_bufs = new SyncListBuf();

SyncListBuf可以根据情况命名
在start或awek函数中绑定回调函数
m_bufs.Callback = BufChanged;
下面开始变形回调函数内容
void BufChanged(SyncListStruct.Operation op, int itemIndex)
{
Debug.Log(“buf changed:” + op); ///获取变化内容

    Debug.Log("buf indx:" + itemIndex);
    Debug.Log(m_bufs[0].name);   获取回调值

}
修改参数并添加到列表中,一般会在updata中申明
Buf bf = new Buf();
bf.name = “ef”;
m_bufs.Add(bf);
33. VS与unity编译卡死问题

  1. 删除Library文件夹
  2. 删除所有的断点
  1. UGUI的渲染顺序
      1.摄像机的深度。若每个画布带上一个UI相机,那么UI相机的Depth的值将决定两个画布的渲染顺序。
      2.Sorting Layer。若有多个画布,且只有一个UI摄像机,那么此时画布的Sorting Layer属性值的顺序将决定画布的渲染顺序。
      3.Order in Layer。若有多个画布,且只有一个UI摄像机,那么此时画布的Order in Layer属性的值的大小将决定画布的渲染顺序。
      4.在父物体中的顺序。若此时只有一个画布,一个UI摄像机,两个物体在父物体中的顺序将决定渲染顺序。
  2. 阴影显示控制

在这里插入图片描述在这里插入图片描述
两个不同的位置控制阴影显示距离,这样确保影像能在远距离被看见,负面影响为带来计算负担。图2位usky的代码控制脚本,以下为代码控制部分内容
public float ShadowDistance = 150f;

	void Awake () 
	{
		QualitySettings.shadowDistance = ShadowDistance;
	}
	
	void OnValidate () 
	{
		ShadowDistance = Mathf.Max (ShadowDistance, 0f);
		Awake ();
     	}

void OnValidate()编辑器扩展脚本,基本上都是给关卡设计或者策划人员用的。在编译游戏的时候对他们输入的一些数值进行校验,
如何使用OnValidate?
在官方文档上仅有一个简短的说明,并且没有示例代码。
编辑器模式下OnValidate 仅在下面两种情况下被调用:
• 脚本被加载时
• Inspector 中的任何值被修改时

  1. ToggleGroup对象的获取和值的修改
    Toggle[] toggleGroup = tggroup.GetComponentsInChildren(); 获取所有的toggle对象
    if (NetworkParameters.isservers)
    {

//;/’[[

        toggleGroup[0].isOn = true;


    }
    if (NetworkParameters.isClient)
    {
        toggleGroup[1].isOn = true;
    }
  1. 调试问题
    在这里插入图片描述
    把你要打开的unity工程下的temp文件夹和obj下面的debug文件夹删
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值