Unity笔记(三)——父子关系、坐标转换、Input、屏幕
写在前面
写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。这里只有部分语法知识。
九、父子关系
1、获取、设置父对象
(1)获取父对象
可以通过this.transform.parent获取当前对象的父对象Transform组件,通过this. transform. parent. name直接获取父对象名称
void Start(){print(this.transform.parent.name);}
输出:
(2)设置父对象
若是要“断绝父子关系”,移除父对象
可以直接赋空:this.transform.parent = null
或者使用API:this.transform.SetParent(null)
执行效果如下:
设置父子关系,同样的使用API:
this.transform.SetParent(GameObject.Find("father").transform);
直接在SetParent()中传入目标对象的transform即可。这里需要提SetParent()的第二个参数,第二个参数为worldPositionStays
如果填true: 保持世界坐标(默认)
如果填false:直接采⽤本地坐标
现在看一个示例:当前目标父对象transform信息为
子对象(还未挂到父对象下)信息为:
运行代码:
void Start(){this.transform.SetParent(GameObject.Find("father").transform,true);}
子对象当前信息如下,可见原世界信息没有改变,inspector信息修改为了与父对象的相对信息
如果运行代码为:
void Start(){this.transform.SetParent(GameObject.Find("father").transform,false);}
子对象当前信息如下,inspector信息没变:
但解开父子关系后,子对象世界信息发生改变:
2、获取、设置子对象
(1)移除所有子对象
使用this.transform.DetachChildren()断绝与所有直接子对象的关系,不影响孙子对象;所有⼦对象变为场景根节点的子对象,位置/旋转/缩放保持原世界坐标值
例如,这是原来的关系:
执行:
void Start(){this.transform.DetachChildren();}
(2)获取子对象
按名查找:使⽤this.transform.Find("子对象名"),可以找到失活对象
获取子对象数量:this.transform.childCount
按索引获取子对象:this.transform.GetChild(索引),索引超范围会报错
如下例,此时有11个子对象:
我们可以查找里面任意一个子对象,也可以直接遍历输出子对象的名字:
void Start()
{print(this.transform.Find("son").name);for(int i = 0; i < this.transform.childCount;i++){print(this.transform.GetChild(i).name);}
}
部分输出:
3、儿子的操作
这些都是固定的API,记住即可
(1)判断当前对象是否是自己的父对象
使用this.transform.IsChildOf()判断当前对象是否是另⼀个对象的子对象。参数传入父对象的transform。返回值是bool值。
public Transform son;void Start(){print(son.transform.transform.IsChildOf(this.transform));}
(2)编号相关
可以用GetSiblingIndex()获得自己作为儿子的编号,SetAsFirstSibling()将当前对象设置为第一个儿子
void Start()
{print(son.GetSiblingIndex());son.SetAsFirstSibling();
}
运行结果:
除此之外,还可以将自己设置为最后一个儿子、设置为指定编号的儿子:
son.SetAsLastSibling();son.SetSiblingIndex(5);
需要注意的是,编号超出范围自动设置为最后一个儿子。
十、 坐标转换
1、世界坐标系转本地坐标系
世界坐标系转本地坐标系,可以帮助我们大概判断相对位置
(1)世界坐标系的点转换为相对本地坐标系的点
该转换方式受缩放影响。一般来讲,当立方体缩放为(2,2,2)时,转换结果会缩小为原值的1/2;缩放为(0.5,0.5,0.5)时,结果会放大为原值的2倍。
void Start()
{print(Vector3.forward);print("转换后的点:" + this.transform.InverseTransformPoint(Vector3.forward));
}
这里由于挂载的对象位置坐标就是 001,因此Vector3.forward以当前对象坐标为原点建立坐标系时,转换后为000
(2)世界坐标系的方向转换为相对于本地坐标系的方向
有受缩放影响和不受缩放影响,如下:
void Start()
{//不受print("转换后的方向:" + this.transform.InverseTransformDirection(Vector3.forward));//受print("受缩放影响转换后的方向:"+this.transform.TransformVector(Vector3.forward));
}
2、本地坐标系转世界坐标系
(1)本地坐标系的点转换为相对世界坐标系的点
受缩放影响
void Start()
{print(Vector3.forward);print("转换后的点:" + this.transform.TransformPoint(Vector3.forward));
}
(2)本地坐标系的方向转换为相对于世界坐标系的方向
有受缩放影响和不受缩放影响,如下:
void Start()
{print("转换后的方向:"+this.transform.TransformDirection(Vector3.forward));print("受缩放影响转换后的方向:" + this.transform.TransformVector(Vector3.forward));
}
十一、input输入相关
1、检测鼠标
(1)鼠标在屏幕上的位置
屏幕坐标的原点在屏幕的左下角, 往右是x轴正方向,往上是y轴正方向。屏幕是2D的,不存在z轴,所以z轴一直都是0。获取鼠标位置使用Input.mousePosition
void Update(){print(Input.mousePosition);}
当鼠标一直在屏幕上动时,就会打印出鼠标位置:
(2)检测鼠标输入
鼠标的按键编号是:0代表左键、1代表右键、3代表中键。
若是想进行按下检测,也就是鼠标按下的一瞬间 进入,需要使用:Input.GetMouseButtonDown() ,里面传入0、1、2就可以分别检测左键、右键、中键
void Update(){if(Input.GetMouseButtonDown(0)){print("鼠标左键按下");}}
若是想进行抬起检测,也就是鼠标抬起的一瞬间 进入,需要使用:Input.GetMouseButtonUp()
void Update()
{if(Input.GetMouseButtonUp(1)){print("鼠标右键抬起");}
}
鼠标长按按下抬起都会进入,当按住按键不放时,会一直处于这个判断
void Update()
{if(Input.GetMouseButton(0)){print("鼠标左键长按");}
}
以上需要注意的是, Down/Up只在动作发⽣的瞬间触发⼀次,长按会一直处于这个判断,不停打印。
最后是中键滚动,使用Input.mouseScrollDelta可以获取中键滚动的Vector2值。
中键滚动改变y值,若是0就是未滚动状态,向上给滚动为1,向下滚动为0
print(Input.mouseScrollDelta);
2、检测键盘
键盘同样有三种状态、按下、抬起、长按。
(1)键盘按下
检测键盘按下方式为:Input.GetKeyDown(),推荐传入枚举参数为KeyCode.W,这个枚举参数指的就是键盘按键w
还可以直接传入要检测的按键字符,不能传入大写字符串,只能传入小写字符串。例如直接传入“q”无论用户按下的是大写Q还是小写q都能正常检测。
void Update()
{if(Input.GetKeyDown(KeyCode.W)){print("W按下");}if(Input.GetKeyDown("q")){print("Q按下");}
}
(2)键盘抬起
检测键盘抬起方式为:Input.GetKeyUp()
void Update()
{if(Input.GetKeyUp(KeyCode.W)){print("W抬起");}
}
(3)键盘长按
void Update()
{if(Input.GetKey(KeyCode.S)){print("S长按");}
}
3、检测默认轴输入
由于常用的键盘输入就是awsd进行上下左右移动,以及横纵向移动鼠标调整位置或是视角。因此Unity内置了默认轴输入相关的便捷方法。
其原理是:将输⼊映射到⼗字坐标系,左/下为负值(-1到0),右/上为正值(0到1),中心点为0。
使用的方法是GetAxis,其中GetAxis有渐变,GetAxisRaw没有渐变(只有0,-1, 1,没有0~1或是0~-1的过程)
(1)键盘AD
使用参数Horizontal,当按A键时,就会输出0~-1之间的数,一直长按会输出-1;当按D键时,就会输出0~1之间的数,一直长按会输出1
void Update()
{print(Input.GetAxis("Horizontal"));
}
(2)键盘SW
使用参数Vertical,当按S键时,就会输出0~-1之间的数,一直长按会输出-1;当按W键时,就会输出0~1之间的数,一直长按会输出1
void Update()
{print(Input.GetAxis("Vertical"));
}
(3)鼠标横向移动
使用参数Mouse X,当鼠标向左移动时,就会输出0~-1之间的数;当向右移动时时,就会输出0~1之间的数
void Update()
{print(Input.GetAxis("Mouse X"));
}
(4)鼠标纵向移动
使用参数Mouse Y,使用参数Mouse X,当鼠标向下移动时,就会输出0~-1之间的数;当向上移动时时,就会输出0~1之间的数
void Update()
{print(Input.GetAxis("Mouse Y"));
}
4、任意键
可以检测是否有任意键或鼠标长按:Input.anyKey
是否有任意键或鼠标按下:Input.anyKeyDown
得到这一帧的键盘输入:InputString
void Update()
{if(Input.anyKey){print("有一个键长按");}if(Input.anyKeyDown){print("有一个键按下(只打印一次)");print(Input.inputString);}
}
5、手柄输入相关
//得到连接的手柄的所有按键名字string[] strs = Input.GetJoystickNames();//某一个手柄键按下if(Input.GetButtonDown("Jump")){}//某一个手柄键抬起if (Input.GetButtonUp("Jump")){}//某一个手柄键长按if (Input.GetButton("Jump")){}
6、移动设备触摸相关
移动设备触摸一般在UI里完成,这里用的很少
if(Input.touchCount>0){Touch t1 = Input.touches[0];//位置print(t1.position);//相对上次位置的变化print(t1.deltaPosition);}
是否启用多点触控
Input.multiTouchEnabled = false;
7、陀螺仪(重力感应)
例如,滚小球游戏就会用到
是否开启陀螺仪:
Input.gyro.enabled = true;
一些静态变量:
//重力加速度向量
print(Input.gyro.gravity);//转速
print(Input.gyro.rotationRate);//当前旋转的四元数
print(Input.gyro.attitude);
十二、屏幕相关
1、静态属性
(1)常用
获取当前屏幕分辨率:
通过Screen.currentResolution获取,获取的是设备物理分辨率
返回值类型:Resolution结构体,包含width(宽)、height(⾼)和refreshRate(刷新率)
void Start()
{Resolution r = Screen.currentResolution;print("当前设备的物理分辨率的宽:"+r.width+"高"+r.height+")");
}
屏幕窗口当前宽高:
获取的是当前游戏窗口的实际显示尺寸,会随窗口大小变化,更适合用于游戏内UI布局和位置计算
void Start()
{print(Screen.width);print(Screen.height);
}
屏幕休眠模式:
通过Screen.sleepTimeout设置,其中SleepTimeout.NeverSleep: 永不息屏;SleepTimeout.SystemSetting: 使⽤系统设置
void Start()
{Screen.sleepTimeout = SleepTimeout.NeverSleep;Screen.sleepTimeout = SleepTimeout.SystemSetting;
}
(2)不常用
下面的都不常用,在开发时一般不在这里用代码设置,了解即可
运行时是否全屏模式
Screen.fullScreen = true;
窗口模式,共有四种:
//独占全屏
Screen.fullScreenMode= FullScreenMode.ExclusiveFullScreen;
//全屏窗口
Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
//最大化窗
Screen.fullScreenMode = FullScreenMode.MaximizedWindow;
//窗口模式
Screen.fullScreenMode = FullScreenMode.Windowed;
移动设备屏幕转向相关
允许自动旋转为左横向、右横向、竖向、倒置竖向
//允许自动旋转为左横向 Home键在左
Screen.autorotateToLandscapeLeft = true;//允许自动旋转为右横向 Home键在右
Screen.autorotateToLandscapeRight = true;//允许自动旋转为上横向 Home键在上
Screen.autorotateToPortraitUpsideDown = true;//允许自动旋转为下横向 Home键在下
Screen.autorotateToPortrait = true;
2、静态方法
设置分辨率,一般移动设备不用,三个参数分别为:宽、高、是否全屏
Screen.SetResolution(1920, 1080, true);