Unity笔记(三)——父子关系、坐标转换、Input、屏幕

写在前面

写本系列的目的(自用)是回顾已经学过的知识、记录新学习的知识或是记录心得理解,方便自己以后快速复习,减少遗忘。这里只有部分语法知识。

九、父子关系

1、获取、设置父对象

(1)获取父对象

可以通过this.transform.parent获取当前对象的父对象Transform组件,通过this. transform. parent. name直接获取父对象名称

cs 复制代码
    void Start()
    {
        print(this.transform.parent.name);

    }

输出:

(2)设置父对象

若是要"断绝父子关系",移除父对象

可以直接赋空:this.transform.parent = null

或者使用API:this.transform.SetParent(null)

执行效果如下:

设置父子关系,同样的使用API:

cs 复制代码
this.transform.SetParent(GameObject.Find("father").transform);

直接在SetParent()中传入目标对象的transform即可。这里需要提SetParent()的第二个参数,第二个参数为worldPositionStays

如果填true: 保持世界坐标(默认)

如果填false:直接采⽤本地坐标

现在看一个示例:当前目标父对象transform信息为

子对象(还未挂到父对象下)信息为:

运行代码:

cs 复制代码
    void Start()
    {
        this.transform.SetParent(GameObject.Find("father").transform,true);
    }

子对象当前信息如下,可见原世界信息没有改变,inspector信息修改为了与父对象的相对信息

如果运行代码为:

cs 复制代码
    void Start()
    {
        this.transform.SetParent(GameObject.Find("father").transform,false);
    }

子对象当前信息如下,inspector信息没变:

但解开父子关系后,子对象世界信息发生改变:

2、获取、设置子对象

(1)移除所有子对象

使用this.transform.DetachChildren()断绝与所有直接子对象的关系,不影响孙子对象;所有⼦对象变为场景根节点的子对象,位置/旋转/缩放保持原世界坐标值

例如,这是原来的关系:

执行:

cs 复制代码
    void Start()
    {
        this.transform.DetachChildren();
    }

(2)获取子对象

按名查找:使⽤this.transform.Find("子对象名"),可以找到失活对象

获取子对象数量:this.transform.childCount

按索引获取子对象:this.transform.GetChild(索引),索引超范围会报错

如下例,此时有11个子对象:

我们可以查找里面任意一个子对象,也可以直接遍历输出子对象的名字:

cs 复制代码
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值。

cs 复制代码
    public Transform son;

    void Start()
    {
        print(son.transform.transform.IsChildOf(this.transform));
    }

(2)编号相关

可以用GetSiblingIndex()获得自己作为儿子的编号,SetAsFirstSibling()将当前对象设置为第一个儿子

cs 复制代码
void Start()
{
    print(son.GetSiblingIndex());

    son.SetAsFirstSibling();
}

运行结果:

除此之外,还可以将自己设置为最后一个儿子、设置为指定编号的儿子:

cs 复制代码
    son.SetAsLastSibling();

    son.SetSiblingIndex(5);

需要注意的是,编号超出范围自动设置为最后一个儿子。

十、 坐标转换

1、世界坐标系转本地坐标系

世界坐标系转本地坐标系,可以帮助我们大概判断相对位置

(1)世界坐标系的点转换为相对本地坐标系的点

该转换方式受缩放影响。一般来讲,当立方体缩放为*(* 2*,* 2*,* 2*)* 时,转换结果会缩小为原值的1/2;缩放为*(* 0*.* 5*,* 0*.* 5*,* 0*.* 5*)* 时,结果会放大为原值的2倍。

cs 复制代码
void Start()
{
    print(Vector3.forward);
    print("转换后的点:" + this.transform.InverseTransformPoint(Vector3.forward));
}

这里由于挂载的对象位置坐标就是 001,因此Vector3.forward以当前对象坐标为原点建立坐标系时,转换后为000

(2)世界坐标系的方向转换为相对于本地坐标系的方向

有受缩放影响和不受缩放影响,如下:

cs 复制代码
void Start()
{
    //不受
    print("转换后的方向:" + this.transform.InverseTransformDirection(Vector3.forward));
    //受
    print("受缩放影响转换后的方向:"+this.transform.TransformVector(Vector3.forward));
}

2、本地坐标系转世界坐标系

(1)本地坐标系的点转换为相对世界坐标系的点

受缩放影响

cs 复制代码
void Start()
{
    print(Vector3.forward);

    print("转换后的点:" + this.transform.TransformPoint(Vector3.forward));
}

(2)本地坐标系的方向转换为相对于世界坐标系的方向

有受缩放影响和不受缩放影响,如下:

cs 复制代码
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

cs 复制代码
    void Update()
    {
        print(Input.mousePosition);
    }

当鼠标一直在屏幕上动时,就会打印出鼠标位置:

(2)检测鼠标输入

鼠标的按键编号是:0代表左键、1代表右键、3代表中键。

若是想进行按下检测,也就是鼠标按下的一瞬间 进入,需要使用:Input.GetMouseButtonDown() ,里面传入0、1、2就可以分别检测左键、右键、中键

cs 复制代码
    void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            print("鼠标左键按下");
        }
    }

若是想进行抬起检测,也就是鼠标抬起的一瞬间 进入,需要使用:Input.GetMouseButtonUp()

cs 复制代码
void Update()
{
    if(Input.GetMouseButtonUp(1))
    {
        print("鼠标右键抬起");
    }
}

鼠标长按按下抬起都会进入,当按住按键不放时,会一直处于这个判断

cs 复制代码
void Update()
{
    if(Input.GetMouseButton(0))
    {
        print("鼠标左键长按");
    }
}

以上需要注意的是, Down/Up只在动作发⽣的瞬间触发⼀次,长按会一直处于这个判断,不停打印。

最后是中键滚动,使用Input.mouseScrollDelta可以获取中键滚动的Vector2值。

中键滚动改变y值,若是0就是未滚动状态,向上滚动为正,向下滚动为负

cs 复制代码
print(Input.mouseScrollDelta);

2、检测键盘

键盘同样有三种状态、按下、抬起、长按。

(1)键盘按下

检测键盘按下方式为:Input.GetKeyDown(),推荐传入枚举参数为KeyCode.W,这个枚举参数指的就是键盘按键w

还可以直接传入要检测的按键字符,不能传入大写字符串,只能传入小写字符串。例如直接传入"q"无论用户按下的是大写Q还是小写q都能正常检测。

cs 复制代码
void Update()
{
    if(Input.GetKeyDown(KeyCode.W))
    {
        print("W按下");
    }

    if(Input.GetKeyDown("q"))
    {
        print("Q按下");
    }
}

(2)键盘抬起

检测键盘抬起方式为:Input.GetKeyUp()

cs 复制代码
void Update()
{
    if(Input.GetKeyUp(KeyCode.W))
    {
        print("W抬起");
    }
}

(3)键盘长按

cs 复制代码
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

cs 复制代码
void Update()
{
    print(Input.GetAxis("Horizontal"));
}

(2)键盘SW

使用参数Vertical,当按S键时,就会输出0~-1之间的数,一直长按会输出-1;当按W键时,就会输出0~1之间的数,一直长按会输出1

cs 复制代码
void Update()
{
    print(Input.GetAxis("Vertical"));
}

(3)鼠标横向移动

使用参数Mouse X,当鼠标向左移动时,就会输出0~-1之间的数;当向右移动时时,就会输出0~1之间的数

cs 复制代码
void Update()
{
    print(Input.GetAxis("Mouse X"));
}

(4)鼠标纵向移动

使用参数Mouse Y,使用参数Mouse X,当鼠标向下移动时,就会输出0~-1之间的数;当向上移动时时,就会输出0~1之间的数

cs 复制代码
void Update()
{
    print(Input.GetAxis("Mouse Y"));
}

4、任意键

可以检测是否有任意键或鼠标长按:Input.anyKey

是否有任意键或鼠标按下:Input.anyKeyDown

得到这一帧的键盘输入:InputString

cs 复制代码
void Update()
{
    if(Input.anyKey)
    {
        print("有一个键长按");
    }

    if(Input.anyKeyDown)
    {
        print("有一个键按下(只打印一次)");

        print(Input.inputString);
    }
}

5、手柄输入相关

cs 复制代码
        //得到连接的手柄的所有按键名字
        string[] strs = Input.GetJoystickNames();

        //某一个手柄键按下
        if(Input.GetButtonDown("Jump"))
        {}

        //某一个手柄键抬起
        if (Input.GetButtonUp("Jump"))
        {}

        //某一个手柄键长按
        if (Input.GetButton("Jump"))
        {}

6、移动设备触摸相关

移动设备触摸一般在UI里完成,这里用的很少

cs 复制代码
        if(Input.touchCount>0)
        {
            Touch t1 = Input.touches[0];

            //位置
            print(t1.position);

            //相对上次位置的变化
            print(t1.deltaPosition);
        }

是否启用多点触控

cs 复制代码
Input.multiTouchEnabled = false;

7、陀螺仪(重力感应)

例如,滚小球游戏就会用到

是否开启陀螺仪:

cs 复制代码
Input.gyro.enabled = true;

一些静态变量:

cs 复制代码
//重力加速度向量
print(Input.gyro.gravity);

//转速
print(Input.gyro.rotationRate);

//当前旋转的四元数
print(Input.gyro.attitude);

十二、屏幕相关

1、静态属性

(1)常用

获取当前屏幕分辨率:

通过Screen.currentResolution获取,获取的是设备物理分辨率

返回值类型:Resolution结构体,包含width(宽)、height(⾼)和refreshRate(刷新率)

cs 复制代码
void Start()
{
    Resolution r = Screen.currentResolution;
    print("当前设备的物理分辨率的宽:"+r.width+"高"+r.height+")");
}

屏幕窗口当前宽高:

获取的是当前游戏窗口的实际显示尺寸,会随窗口大小变化,更适合用于游戏内UI布局和位置计算

cs 复制代码
void Start()
{
    print(Screen.width);
    print(Screen.height);
}

屏幕休眠模式:

通过Screen.sleepTimeout设置,其中SleepTimeout.NeverSleep: 永不息屏;​​​​​​SleepTimeout.SystemSetting: 使⽤系统设置

cs 复制代码
void Start()
{
    Screen.sleepTimeout = SleepTimeout.NeverSleep;
    Screen.sleepTimeout = SleepTimeout.SystemSetting;
}

(2)不常用

下面的都不常用,在开发时一般不在这里用代码设置,了解即可

运行时是否全屏模式

cs 复制代码
Screen.fullScreen = true;

窗口模式,共有四种:

cs 复制代码
//独占全屏
Screen.fullScreenMode= FullScreenMode.ExclusiveFullScreen;
//全屏窗口
Screen.fullScreenMode = FullScreenMode.FullScreenWindow;
//最大化窗
Screen.fullScreenMode = FullScreenMode.MaximizedWindow;
//窗口模式
Screen.fullScreenMode = FullScreenMode.Windowed;

移动设备屏幕转向相关

允许自动旋转为左横向、右横向、竖向、倒置竖向

cs 复制代码
//允许自动旋转为左横向 Home键在左
Screen.autorotateToLandscapeLeft = true;

//允许自动旋转为右横向 Home键在右
Screen.autorotateToLandscapeRight = true;

//允许自动旋转为上横向 Home键在上
Screen.autorotateToPortraitUpsideDown = true;

//允许自动旋转为下横向 Home键在下
Screen.autorotateToPortrait = true;

2、静态方法

设置分辨率,一般移动设备不用,三个参数分别为:宽、高、是否全屏

cs 复制代码
 Screen.SetResolution(1920, 1080, true);
相关推荐
年少无知且疯狂42 分钟前
【Unity】RectTransformUtility.ScreenPointToLocalPointInRectangle
unity·游戏引擎
峥嵘life1 小时前
Android初学者系统开发学习路线参考
android·学习
-风中叮铃-1 小时前
【MongoDB学习笔记1】MongoDB的常用命令介绍-数据库操作、集合操作、文档操作、文档分页查询、高级查询
数据库·学习·mongodb
生医转码,四海为家1 小时前
零基础-动手学深度学习-9.7. 序列到序列学习(seq2seq)
学习
野蛮人6号2 小时前
MySQL笔记
数据库·笔记·mysql
snowfoootball2 小时前
2025 蓝桥杯C/C++国B 部分题解
c语言·c++·笔记·学习·贪心算法·蓝桥杯
受之以蒙2 小时前
web-sys进阶:事件处理、异步操作与 Web API 实践
笔记·rust·webassembly
Olrookie4 小时前
若依前后端分离版学习笔记(七)—— Mybatis,分页,数据源的配置及使用
数据库·笔记·学习·mybatis·ruoyi
慕y2744 小时前
Java学习第一百一十一部分——Jenkins(二)
java·开发语言·学习·jenkins
星期天要睡觉4 小时前
机器学习——支持向量机(SVM)实战案例
笔记·算法·支持向量机