Unity脚本(二)

news2024/11/15 23:54:02

视频教程:https://www.bilibili.com/video/BV12s411g7gU/?share_source=copy_web   

Transform

对象的位置、旋转和缩放

场景中的每个对象都有一个Transform,用于存储和操作对象的位置、旋转和缩放。 每个Transform都可以有一个父级,能够分层应用位置、旋转和缩放

Transform.position:相对于世界坐标系原点的位置 

Transform.localPosition:相对于父物体轴心点的位置,若没有父级,则其与Transform.position相同

Transform.localScale:相对于父物体的缩放比例

ps:Inspector面板中的Position、Rotation、 Scale均是相对于父物体的

将Inspector面板设置为debug

  

Transform.lossyScale: 物体的全局缩放比例(只读)

ps:lossyScale=自身缩放比例*父物体缩放比例;假设父物体localScale为2,子物体localScale为3,则其lossyScale为6

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformDemo : MonoBehaviour
{
    public Transform root;

    void OnGUI()
    {
        if (GUILayout.Button("foreach--transform"))
        {
            foreach (Transform child in this.transform)
            {
                print(child.name);
            }
        }

        if (GUILayout.Button("root"))
        {
            print(this.transform.parent);
        }

        if (GUILayout.Button("Space.World--setParent"))
        {
            //当前物体的位置视为世界坐标
            this.transform.SetParent(root);
        }

        if (GUILayout.Button("Self.World--setParent"))
        {
            //当前物体的位置视为localScale
            this.transform.SetParent(root, false);
        }

        if (GUILayout.Button("DetachChildren"))
        {
            this.transform.DetachChildren();
        }

        if (GUILayout.Button("Find"))
        {
            print(this.transform.Find("Cube"));
        }

        if (GUILayout.Button("childCount"))
        {
            int count = this.transform.childCount;
            for (int i = 0; i < count; i++)
            {
                print(transform.GetChild(i));
            }
        }

        if (GUILayout.Button("Self.World--Z+1"))
        {
            this.transform.Translate(0, 0, 1);
        }

        if (GUILayout.Button("Space.World--Z+1"))
        {
            this.transform.Translate(0, 0, 1, Space.World);
        }

        if (GUILayout.Button("Self.World--Rotate_X+1"))
        {
            this.transform.Rotate(10, 0, 0);
        }

        if (GUILayout.Button("Space.World--Rotate_X+1"))
        {
            this.transform.Rotate(10, 0, 0, Space.World);
        }

        if (GUILayout.RepeatButton("RotateAround"))
        {
            this.transform.RotateAround(Vector3.zero, Vector3.up, 1);
        }
    }
}

foreach--transform按钮:获取直接(第一代)子物体的物体名

有如下图的父子关系,child 1、child 2和child 3是父物体parent的直接(第一代)子物体,而_child 1、_child 2是其间接(第二代)子物体;将TransformDemo挂载至父物体parent上 

运行后点击foreach--transform按钮,可以观察到控制台输出第一代子物体的物体名

Transform.parent:获取根物体的Transform组件

root按钮:输出根物体的物体名(类似树中的根节点);如同样有上文中的父子关系图,分别将脚本挂载至child 1和_child 1并点击root按钮,可以观察到控制台输出的均是parent

Transform.SetParent:设置当前Transform的父级

Space.World--setParent按钮与Self.World--setParent按钮:两者的功能都是将当前游戏对象设置为另一游戏对象的子物体(设置父级),区别在于设置父子关系后的位置

在Space.World--setParent按钮中 

this.transform.SetParent(root)

 等价于

this.transform.SetParent(root,true)

上述代码的含义为将当前物体设置为root的子物体后,将当前物体相对于世界坐标系原点的位置转换为相对于root的localPosition,即当前物体在世界坐标系中的位置不发生改变

如下图root(15,0,0),Cube(15,0,5),执行后Cube中世界坐标的位置仍为(15,0,5),而相对于root的localPosition为(0,0,5) 

而在Self.World--setParent按钮中

this.transform.SetParent(root, false)

该代码的含义为将当前物体设置为root的子物体后,将当前物体相对于世界坐标系原点的位置作为相对于root的localPosition,即当前物体在世界坐标系中的位置等于父物体在世界坐标中的位置+当前物体此前在世界坐标中的位置(两者的向量和)

如下图root(15,0,0),Cube(15,0,5),执行后Cube中世界坐标的位置为(30,0,5),而相对于root的localPosition为(15,0,5)

Transform.DetachChildren:解除父级的所有直接(第一代)子项(子物体)

DetachChildren按钮: 若有如foreach--transform中父子结构,同样为parent挂载该脚本,运行后点击DetachChildren按钮,则parent的所有直接子项解除与父级parent的关系;即分离出了child 1、child 2、child 3,而_child 1和_child 2仍分别作为child 1和child 2的子项

Transform.Find:寻找并返回对应名称的子项

 Find按钮:在所有直接子项中寻找并返回名为Cube的子项

Transform.childCount:返回父级的直接(第一代)子项数 

Transform.GetChild:按索引返回对应的直接(第一代)子项

childCount按钮:与foreach--transform按钮功能类似但可以按索引返回对应的第一代子项;同样以foreach--transform中父子结构为例,为parent挂载该脚本,运行并点击childCount按钮,可以观察到控制台输出父级parent的第一代子项

Transform.Translate:按世界坐标或者本地坐标移动物体

Self.World--Z+1按钮与Space.World--Z+1:两者的功能都是使物体的Z轴+1,但参考系不同,Self.World--Z+1参考的是物体的自身坐标而Space.World--Z+1参考的是世界坐标

在Self.World--Z+1中

this.transform.Translate(0, 0, 1)

等同于

this.transform.Translate(0, 0, 1, Space.Self)

 关于自身坐标与世界坐的区别,如下图所示

Transform.Rotate:按世界坐标或者本地坐标旋转物体,通常以欧拉角而不是四元数提供旋转

Self.World--Rotate_X+1按钮与Space.World--Rotate_X+1按钮,两者的功能均是将物体绕X轴选择1度,而区别同样在于参考系不同

Transform.RotateAround:围绕穿过世界坐标中的一点的旋转轴旋转物体

RotateAround按钮:使物体围绕穿过坐标原点方向向量为(0,1,0)的旋转轴进行旋转

使用递归在层级未知的情况下查找子项

编写脚本TransformHelper

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformHelper : MonoBehaviour
{
    public string target;

    void OnGUI()
    {
        if (GUILayout.Button("Recursion_Find"))
        {
            print(Recursion_Find(this.transform, target));
        }
    }

    Transform Recursion_Find(Transform root, string name)
    {
        Transform target = root.transform.Find(name);
        if (target) return target;
        if (root.transform.childCount == 0) return null;
        foreach (Transform child in root.transform)
        {
            if (Recursion_Find(child, name) != null)
            {
                return Recursion_Find(child, name);
            }
        }
        return null;
    }
}

 更改foreach--transform中展示父子结构,在child 3添加一个名为target的Cube作为查找的目标

在parent上挂载脚本并进行参数设置后,运行场景点击Game面板中左上角的Recursion_Find按钮,可以观察控制台输出了子项target

 

GameObject

GameObject.activeInHierarchy:物体实际激活状态 

GameObject.activeSelf:物体自身激活状态(Inspector面板中的状态,且是只读的)

如下图,父级child 1被禁用导致子项_child 1被禁用,但实际上子项_child 1在Inspector面板中仍是启用状态

  

 

 

在上述情况下,子项_child 1的activeInHierarchy为fales,而activeSelf为true

GameObject.SetActive:启用/禁用物体

GameObject.AddComponent<T>():将组件T添加到游戏对象

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameObjectDemo : MonoBehaviour
{
    void OnGUI()
    {
        if (GUILayout.Button("添加光源"))
        {
            GameObject lightGO = new GameObject();
            Light light = lightGO.AddComponent<Light>();
            light.color=Color.red;
            light.type=LightType.Point;
        }
    }
}

ps:在脚本中挂载组件时无需使用new关键字创建对象,因为执行AddComponent方法以包含了使用new进行构造的过程

为某一游戏对象挂载该脚本,运行后点击Game面板中左上角的“添加光源”按钮,即可发现创建中新增了一个挂载light组件且名为New Game Object的游戏对象 

 

GameObject.Find("游戏对象名称"):在场景中根据名字查找物体(慎用,该方法将会尝试遍历场景中的每一个游戏对象)

GameObject.FindGameObjectWithTag("标签名称"):返回第一使用该标签的物体(单个)

GameObject.FindGameObjectsWithTag("标签名称"):返回所有使用该标签的物体(数组)

Object

Object.Destroy(Object obj, float delay= 0.0F):移除GameObject、组件或资源

obj要销毁的对象
delay(可选)销毁对象前的延迟时间

Object.DestroyImmediate:立即销毁游戏对象(建议改用 Destroy)

Object.DontDestroyOnLoad:在加载新的Scene时,不销毁Object

Object.FindObjectOfType<T>():返回第一个类型为T的激活对象(单个)

Object.FindObjectsOfType<T>():返回所有类型为T的对象(数组)

查找血量最低的敌人 

编写脚本Enemy

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Enemy : MonoBehaviour
{
    public float hp;
}

在场景中创建三个游戏物体分别命名为Enemy 1、 Enemy 2、Enemy 3,为其挂载脚本Enemy并设置不同的Hp

 

 

 

 编写脚本Find_Enemies并将其挂载至某一游戏物体后,运行场景并点击“查找血量最低的敌人”按钮

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Find_Enemies : MonoBehaviour
{
    void OnGUI() {
        if(GUILayout.Button("查找血量最低的敌人")){
            var enemy_list=Object.FindObjectsOfType<Enemy>();
            Enemy target=enemy_list[0];
            foreach(Enemy i in enemy_list){
                if(target.hp>i.hp){
                    target=i;
                }
            }
            print(target);
        }
    }
}

getcomponentinparent

lookat

GetSiblingIndex

Time

time 

deltaTime 每帧的间隔 完成一帧的时间

unscaletime

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/130757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型&#xff0c;如下所示&am…

gitlab-ci.yml关键字(五)tags 、only 、when

tags 使用Tags用于选择Runner的标签列表 我们在创建Runner 时可以给该Runner打上特定的标签&#xff0c;那后续流水线中的job如果需要使用特定标签的Runner执行时&#xff0c;就需要使用tags来标记 比如这里有两个标签的Runner 也可以对当前的runner进行一些配置上的设置 …

2022总结:我是怎样从一个混子到如今小有所成

前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;红中 &#x1f342;抽根烟&#xff0c;吹个牛b(不是 入门 如果硬要问我是在什么时候入门的&#xff0c;那就要说到高一…

MySQL添加用户及用户权限管理

目录 1、用户 <1> 用户信息 <2> 创建用户 <3> 删除用户 <4> 修改用户密码 2、用户权限管理 <1> 查看用户权限 <2> 给用户授权 <3> 回收权限 1、用户 <1> 用户信息 MySQL中的用户&#xff0c;都存储在系统数据库mysq…

机器翻译与数据集

机器翻译指的是将文本序列从一种语言自动翻译成另一种语言。 使用单词级词元化时的词表大小&#xff0c;将明显大于使用字符级词元化时的词表大小。为了缓解这一问题&#xff0c;我们可以将低频词元视为相同的未知词元。 通过截断和填充文本序列&#xff0c;可以保证所有的文…

【LeetCode每日一题】——154.寻找旋转排序数组中的最小值 II

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【解题思路】七【题目提示】八【题目进阶】九【时间频度】十【代码实现】十一【提交结果】一【题目类别】 二分查找 二【题目难度】 困难 三【题目编号】 154.寻找旋转排序数组中的最小…

windows下OpenCV安装教程以及vs2019配置opencv教程

文章目录一. OpenCV下载二. OpenCV安装及配置三. VS2019项目配置OpenCV一. OpenCV下载 官网地址&#xff1a;Home - OpenCV 下载地址&#xff1a;OpenCV download | SourceForge.net 二. OpenCV安装及配置 双击下载好的安装包进行安装 安装过程实际上是一个解压过程 选择…

java开发机动车考试驾照考试-科一科四考试在线题库系统

简介 本系统主要是进行科一科四考试和练习的网上考试系统&#xff0c;分为A1B1、A2B2、C1C2的科一科四考试系统&#xff0c;当学员点击开始考试&#xff0c;系统将自动生成随机题目100道&#xff08;选择题80道&#xff0c;判断题20道&#xff09;的试卷&#xff0c;考试时间4…

【数据结构】LeetCode移除元素、删除排序数组中的重复项、合并两个有序数组

目录 一、移除元素 1、题目说明 2、题目解析 二、删除排序数组中的重复项 1、题目说明 2、题目解析 三、合并两个有序数组 1、题目说明 2、题目解析 一、移除元素 1、题目说明 题目链接&#xff1a;移除元素 给你一个数组nums和一个值val&#xff0c;你需要原地移除所有数值等…

php宝塔搭建部署实战彩纸屋在线少儿编程系统源码

大家好啊&#xff0c;我是测评君&#xff0c;欢迎来到web测评。 本期给大家带来一套php开发的彩纸屋在线少儿编程系统源码&#xff0c;感兴趣的朋友可以自行下载学习。 技术架构 PHP7.2 nginx mysql5.7 JS CSS HTMLcnetos7以上 宝塔面板 文字搭建教程 下载源码&#x…

第一个完整的CMake工程

第一个完整的CMake工程一、概述二、准备工作2.1 创建工程2.2 创建源码目录三、换个地方保存目标二进制文件3.1 add_subdirectory 指令说明3.2 重设目标二进制生成目录四、如何安装4.1 目标文件的安装4.2 普通文件的安装4.3 非目标文件的可执行程序安装(比如脚本之类)&#xff1…

git 源码下载安装最新版本

问题 用yum install git 下载后查看版本 git --version 显示的版本太低&#xff0c;自己去github下载比较新的版本 解决 https://github.com/git/git/tags 查看最新的版本&#xff0c;并且复制tar.gz下载链接 wget 你复制的链接 我的例子&#xff1a;wget https://github.…

DevOps:开发运维全流程

目录 &#x1f9e1;什么是DevOps&#xff1f; &#x1f9e1;什么是CI/CD&#xff1f; &#x1f49f;这里是CS大白话专场&#xff0c;让枯燥的学习变得有趣&#xff01; &#x1f49f;没有对象不要怕&#xff0c;我们new一个出来&#xff0c;每天对ta说不尽情话&#xff01; &…

第一章 计算机网络体系结构

目录(1) 概念与功能(2) 组成与分类(3) 标准化工作与组织(4) 性能指标(5) 分层结构、协议、接口、服务(6) 7 层 OSI 参考模型(7) TCP/IP 模型(8) 五层参考模型(1) 概念与功能 1、概念 计算机网络&#xff1a;是一个将分散的、具有独立功能的计算机系统&#xff0c;通过通信设备…

RHI_Shader Compare(HLSL、GLSL、MSL 、WGSL、OpenCL) Debug All

为了后续平台能够更好的封装跨平台Shader&#xff0c;本部分主要来看一下各平台Shader的语法特点、编译方式以及Debug方式等对比。 对于各类Shader语言还是先来看一下官方的文档&#xff0c;里边有具体的阐述&#xff0c;也是比较权威的文档&#xff1a; HLSL官方文档GLSL官…

sftp的基本使用

写在前面 在工作和学习中我们经常需要在linux和本地之间上传和下载文件&#xff0c;本文就一起来看下。 1&#xff1a;连接ftp 在window执行命令sftp 用户名IP,这里的用户名是linux服务器的用户名&#xff0c;IP是linux服务器的IP&#xff0c;如下&#xff1a; [c:\~]$ sft…

mysql统计查询和一行转多行(列转行)--- help_topic

mysql.help_topic help_topic本身是Mysql一个帮助解释注释表&#xff0c;用于解释Mysql各种专有名词&#xff0c;由于这张表数据ID是从0顺序增加的&#xff0c;方便我们用于计数&#xff0c;但是8.0.17版本的只有656条数据&#xff0c;超过这个数字&#xff0c;我们就需要己自定…

【王道操作系统】1.1.1 操作系统的概念、功能和目标(系统资源的管理者、提供接口、作为扩充机器、虚拟机)

操作系统的概念、功能、目标(系统资源的管理者、提供接口、作为扩充机器) 文章目录操作系统的概念、功能、目标(系统资源的管理者、提供接口、作为扩充机器)1.常见的操作系统举例2.操作系统的层次结构3.操作系统的概念4.操作系统的功能和目标4.1 作为计算机系统资源的管理者4.2…

LeetCode题解 二叉树(七):222 完全二叉树的节点个数;110 平衡二叉树;257 二叉树的所有路径

前言 阳过之后&#xff0c;已经有一周多没有接触过一道题目了 从今日开始恢复每日一小时的刷题日常 二叉树 222 完全二叉树的节点个数 medium 无论是深度遍历&#xff08;前中后都好&#xff09;还是层序遍历&#xff0c;都可以用于求解这道题&#xff0c;只需要使用一个额…

【电力系统综合能源】“双碳“背景下|综合能源系统中的经济-二氧化碳排放协调最优调度和敏感性分析研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…