以前理解不到位,写的不清楚,现在重新理了一下。
对象拥有锚点, 但是锚点的位置是对于父对象而言的 ,如下图,父对象是画布,子对象是。举两个栗子就能看清这两者的关系。
不同于锚点, 重心点的位置是相对于对象本身而言的 ,举三个栗子。
width, height : 显而易见是矩形的长宽
Pos X , Pos Y :以锚点为原点,向右、上为正方向的坐标系里,重心点的位置 ,举个两个栗子:
锚框: 四个小雪花不在一起,会组成一个锚框。
Top bottom left right = 矩形组件四边 相对于 锚框四边 的距离
举一个栗子:
猜测:RectTransform类的rect属性决定了RectTransform的绘制,以重心点为原点,向左和向下确定子对象矩形边的位置
1 anchoredPosition属性
① 小雪花在一起时,以锚点为原点,求重心点的相对坐标
②小雪花不在一起时,以右上角的小锚点为原点,求重心点的相对坐标
2 offsetMin属性 以左下角的小锚点为原点 求矩形组件左下角的相对坐标
3 offsetMax属性 以右上角的小锚点为原点 求矩形组件右上角的相对坐标
4 sizeDelta属性 (尺寸变化量)
① 小雪花在一起时,就是矩形组件的长宽;
②小雪花不在一起时,等于 矩形长宽 相对于 锚框长宽 的变化量:
(矩形X轴长度-锚框X轴长度,矩形Y轴长度-锚框Y轴长度)
1、协程不是线程,也不是异步执行的。
2、协程和 MonoBehaviour 的 Update函数一样,也是在MainThread中执行的。
3、使用协程你不用考虑同步和锁的问题。
4、协程可以被yield return在当前帧进行打断,到下一帧后可以继续从被打断的地方继续运行。
5、协程是每帧的LateUpdate()后去运行的。
1、一个Collection要支持foreach方式的遍历,必须实现IEnumerable接口(亦即,必须以某种方式返回IEnumerator object)。
2、IEnumerator object具体实现了iterator(通过MoveNext(),Reset(),Current)。
3、从这两个接口的用词选择上,也可以看出其不同:IEnumerable是一个声明式的接口,声明实现该接口的class是“可枚举(enumerable)”的,但并没有说明如何实现枚举器(iterator);IEnumerator是一个实现式的接口,IEnumerator object就是一个iterator。
4、IEnumerable和IEnumerator通过IEnumerable的GetEnumerator()方法建立了连接,client可以通过IEnumerable的GetEnumerator()得到IEnumerator object,在这个意义上,将GetEnumerator()看作IEnumerator object的factory method也未尝不可。
1、在程序中调用StopCoroutine()方法只能终止以字符串形式启动(开始)的协程
2、多个协程可以同时运行,它们会根据各自的启动顺序来更新
3、协程可以嵌套任意多层
4、如果你想让多个脚本访问一个协程,那么你可以定义静态的协程
5、协程不是多线程(尽管它们看上去是这样的),它们运行在同一线程中,跟普通的脚本一样
6、如果你的程序需要进行大量的计算,那么可以考虑在一个随时间进行的协程中处理它们
7、IEnumerator类型的方法不能带ref或者out型的参数,但可以带被传递的引用
8、目前在Unity中没有简便的方法来检测作用于对象的协程数量以及具体是哪些协程作用在对象上
通过SystemIOPorts来实现
using UnityEngine;using SystemCollections;
using SystemIOPorts;
using System;
using SystemIO;
using SystemCollectionsGeneric;
public class PortControl : MonoBehaviour
{
public string portName = "COM3";
public int baudRate = 57600;
public Parity parity = ParityNone;
public int dataBits = 8;
public StopBits stopBits = StopBitsOne;
SerialPort sp = null;
void Start()
{
OpenPort();
StartCoroutine(DataReceiveFunction());
}
//打开串口
public void OpenPort()
{
sp = new SerialPort(portName, baudRate, parity, dataBits, stopBits);
spReadTimeout = 400;
try
{
spOpen();
}
catch(Exception ex)
{
DebugLog(exMessage);
}
}
//关闭串口
public void ClosePort()
{
try
{
spClose();
}
catch(Exception ex)
{
DebugLog(exMessage);
}
}
/
若串口数据速度慢,数量小,可以在Update函数中使用spReadByte等函数,该协程可以不用调用
若串口数据速度较快,数量较多,就调用该协程(该程序就是这一种,在Start函数中已经被调用)
若串口数据速度非常快,数量非常多,建议使用Thread
/
IEnumerator DataReceiveFunction()
{
byte[] dataBytes = new byte[128];//存储数据
int bytesToRead = 0;//记录获取的数据长度
while(true)
{
if(sp != null && spIsOpen)
{
try
{
//通过read函数获取串口数据
bytesToRead = spRead(dataBytes, 0, dataBytesLength);
//串口数据已经被存入dataBytes中
//往下进行自己的数据处理
//比如将你的数据显示出来,可以利用guiTexttext = 之类
}
catch(Exception ex)
{
DebugLog(exMessage);
}
}
yield return new WaitForSeconds(TimedeltaTime);
}
}
void OnApplicationQuit()
{
ClosePort ();
}
}
结构体:struct。 结构体是一种值类型,通常用于封装一些小型变量数据。
作用:可以帮助我们一次性声明多个不同类型的变量。
注意:字段命名一般都以下划线开头;
结构体和枚举名称命名一般遵循帕斯卡命名法。
以上就是关于Unity新手笔记(1): 矩形组件、锚点、重心点全部的内容,包括:Unity新手笔记(1): 矩形组件、锚点、重心点、Unity协程(Coroutine)、unity3d采用串口通信,怎么接收数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)