当前位置: 首页 > news >正文

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内置了默认轴输入相关的便捷方法。

其原理是:将输⼊映射到⼗字坐标系,左/下为负值(-10),右/上为正值(01),中心点为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);
http://www.lryc.cn/news/612442.html

相关文章:

  • STM32学习笔记3-GPIO输入部分
  • 【模电笔记】—— 直流稳压电源——稳压电路
  • RK3568笔记九十六:多路实时目标检测
  • Python应用指南:获取风闻评论数据并解读其背后的情感倾向(二)
  • 【补题】CodeTON Round 1 (Div. 1 + Div. 2, Rated, Prizes!) D. K-good
  • 基于单片机GD32E103的HID按键问题分析
  • hive专题面试总结2
  • 一、Envoy基础概念学习
  • 8.6笔记
  • 《嵌入式数据结构笔记(四):栈结构与队结构链表》
  • Chrontel【7322BMF】CH7322B HDMI Consumer Electronics Control (CEC) devices
  • GaussDB 数据库架构师修炼(六)-3 集群工具管理-主备倒换
  • prometheus+Grafana 监控中间件项目
  • 202506 电子学会青少年等级考试机器人四级实际操作真题
  • 架构层防护在高并发场景下的实践
  • 机器学习-LinearRegression
  • 机器学习模型调优实战指南
  • 机器学习——SVM
  • 居家养老场景下摔倒识别准确率提升 29%:陌讯动态姿态建模算法实战解析
  • 第五十一章:AI模型服务的“百变面孔”:WebUI/CLI/脚本部署全解析
  • 从原理图到PCB的布局
  • LiveQing视频RTMP推流视频点播服务功能-云端录像支持按时间段下载录像时间段下载视频mp4
  • STM32的PWR
  • 引领GameFi 2.0新范式:D.Plan携手顶级财经媒体启动“龙珠创意秀”
  • ZYNQ实现FFT信号处理项目
  • Python科学计算:从基础到工程仿真的完整指南
  • 指挥中心自动化的演变
  • cygwin+php教程(swoole扩展+redis扩展)
  • Redis使用的常见问题及初步认识
  • JDK17新特性全解析