写在前面

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

九、父子关系

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就是未滚动状态,向上滚动为正,向下滚动为负

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.pswp.cn/diannao/94825.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/94825.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/94825.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Dubbo的高并发服务治理与流量控制实战指南

基于Dubbo的高并发服务治理与流量控制实战指南 在微服务架构的大规模应用场景中&#xff0c;如何保证服务在高并发压力下的稳定与可用&#xff0c;是每位后端开发者必须面对的挑战。本文结合实际生产环境经验&#xff0c;分享基于Apache Dubbo的高并发服务治理与流量控制方案&a…

Mac 洪泛攻击笔记总结补充

一、Mac 洪泛攻击原理交换机依靠 MAC 地址表来实现数据帧的精准转发&#xff0c;该表记录着端口与相连主机 MAC 地址的对应关系。交换机具备自动学习机制&#xff0c;当收到一个数据帧时&#xff0c;会将帧中的源 MAC 地址与进入的端口号记录到 MAC 表中。同时&#xff0c;由于…

路由器不能上网的解决过程

情况 前段时间&#xff0c;公司来人弄了一下网络后&#xff0c;我的路由器就不能上网了&#xff0c;怎么回事啊。 先看看路由器的情况&#xff1a;看着网络是有连接的&#xff1a;看这上面是能上网的&#xff0c;但是网都是上不去。 奇怪&#xff01; 路由器介绍 路由器&#x…

Rancher 和 KubeSphere对比

以下是 Rancher 与 KubeSphere 的深度对比&#xff0c;涵盖核心定位、架构设计、功能模块、适用场景等关键维度&#xff0c;助您精准选型&#xff1a;一、核心定位与设计哲学维度RancherKubeSphere本质Kubernetes 多集群管理控制平面Kubernetes 全栈云原生操作系统目标简化K8s集…

【深度学习新浪潮】TripoAI是一款什么样的产品?

TripoAI是由硅谷AI初创公司VAST开发的多模态3D内容生成平台,其核心技术基于数十亿参数的3D基础模型,专注于通过文本描述、单图/多图输入或手绘涂鸦快速生成高精度可编辑的3D模型。以下是其核心信息: 一、技术架构与核心功能 秒级生成与多模态输入 生成速度:仅需8秒即可生成…

二十八天(数据结构:图的补充)

图&#xff1a;是一种非线性结构形式化的描述: G{V,R}V:图中各个顶点元素(如果这个图代表的是地图&#xff0c;这个顶点就是各个点的地址)R:关系集合&#xff0c;图中顶点与顶点之间的关系(如果是地图&#xff0c;这个关系集合可能就代表的是各个地点之间的距离)在顶点与顶点…

户外广告牌识别准确率↑32%:陌讯多模态融合算法实战解析

原创声明本文为原创技术解析&#xff0c;核心技术参数与架构设计引用自《陌讯技术白皮书》&#xff0c;禁止任何形式的转载与抄袭。一、行业痛点&#xff1a;户外广告牌识别的三大技术瓶颈户外广告牌作为城市视觉符号的重要载体&#xff0c;其智能化识别在商业监测、合规监管等…

【vue组件通信】一文了解组件通信多种方式

前言 在 Vue 中&#xff0c;组件通信有多种方式&#xff0c;适用于不同场景&#xff08;父子组件、兄弟组件、跨级组件等&#xff09;。以下是完整的组件传值方法总结&#xff0c;仅供概览参考&#xff1a;一、父子组件通信 1. Props&#xff08;父 → 子&#xff09; 父组件通…

项目一系列-第3章 若依框架入门

第3章 若依框架入门 3.1 若依框架概述 为什么要基于若依框架开发&#xff1f; 快速开发&#xff1a;能快速搭建一个应用框架&#xff0c;减少工作量。可定制化&#xff1a;提供丰富插件和拓展点&#xff0c;满足不同项目的特定需求。简化开发流程&#xff1a;框架提供常用的功能…

WSL安装MuJoco报错——FatalError: gladLoadGL error

文章目录WSL中配置MuJoCo报错 FatalError: gladLoadGL error 的终极解决方案&#x1f50d; 问题原因分析✅ 解决方案&#xff1a;切换至 EGL 渲染后端第一步&#xff1a;安装系统级依赖库第二步&#xff1a;使用 Conda 安装兼容的图形库第三步&#xff1a;设置环境变量以启用 E…

2025产品经理接单经验分享与平台汇总

产品和开发永远是一家&#xff0c;如此说来产品和开发接单的经验和平台其实大差不差&#xff0c;今天刚好看到后台有人咨询产品经理接单的问题&#xff0c;索性直接写一篇文章好了。 目录 一、产品经理接单的三个关键建议 1、能力产品化&#xff0c;比履历更重要 2、合同、…

BGP协议笔记

一、BGP协议&#xff08;边界网关协议&#xff09; 是一种用于自治系统间的动态路由协议&#xff0c;是一种外部网关(EGP)协议。负责在不同自治系统(AS)之间交换路由信息&#xff0c;目的是实现大规模网络的可扩展性、策略控制和稳定性。 自治系统AS&#xff1a;一组被进行统…

Ⅹ—6.计算机二级综合题27---30套

第27套 【填空题】 给定程序中,函数fun的功能是:计算形参x所指数组中N个数的平均值(规定所有数均为正数),将所指数组中小于平均值的数据依次移至数组的前部,大于等于平均值的数据依次移至x所指数组的后部,平均值作为函数值返回,在主函数中输出平均值和移动后的数据。 …

GDB 调试全方位指南:从入门到精通

在程序开发中&#xff0c;调试是定位和解决问题的核心环节。GDB (GNU Debugger) 作为一款功能强大的命令行调试器&#xff0c;是Linux环境下C/C开发者的必备利器。本文将系统讲解GDB的使用方法&#xff0c;涵盖基础操作到高级技巧&#xff0c;助你高效排错。一、基础准备&#…

Python:从元类到多态的实战指南

Python 作为一门灵活且强大的编程语言&#xff0c;其高级特性为开发者提供了极大的创造力和代码优化空间。本文将围绕元类、序列化、抽象类与多态等核心高级特性展开&#xff0c;结合丰富的实战代码示例&#xff0c;从原理到应用进行全方位解析&#xff0c;帮助你更深入地理解 …

LLM实战(三)——昇腾300i duo推理卡(NPU)大模型推理记录

npu推理环境配置:https://ascend.github.io/docs/sources/ascend/quick_install.html llama-factory适配的NPU说明:https://llamafactory.readthedocs.io/zh-cn/latest/advanced/npu_inference.html 一些CANN命令: 与cuda的对应关系 # 查看NPU信息 npu-smi info = nvidia-s…

【原创】锐捷AM5532宿舍AP接口状态智能巡检实战:Python脚本+Excel报表+QQ自动推送,某高校落地案例

⚡ 项目已稳定运行 180+ 天,累计巡检 14 万接口,邮件告警 0 漏报 📊 CSDN 质量分 5.0 标准:代码 + 图表 + 可落地 + 可复制, 欢迎收藏、点赞、评论三连! 一、背景 某 高校学生宿舍采用锐捷 RG-AM5532 系列交换机下挂无线 AP,高峰期 2.4 万终端并发。 网络中心痛点: …

用户、组和目录的磁盘配额

一、XFS_quota限制用户和组的容量&#xff08;block&#xff09;与文件数量&#xff08;inode&#xff09;&#xff1b;限制block就限制了用户可以使用的磁盘容量&#xff0c;限制inode就可以限制用户新建的文件数量限制某一目录的最大磁盘配额&#xff08;directory project&a…

[GESP202506 五级] 最大公因数

题目描述 对于两个正整数 a,ba,ba,b&#xff0c;他们的最大公因数记为 gcd⁡(a,b)\gcd(a,b)gcd(a,b)。对于 k>3k > 3k>3 个正整数 c1,c2,…,ckc_1,c_2,\dots,c_kc1​,c2​,…,ck​&#xff0c;他们的最大公因数为&#xff1a; gcd⁡(c1,c2,…,ck)gcd⁡(gcd⁡(c1,c2,……