Unity编辑器扩展-番外篇-Gizmos基础-物体如何在球面上移动

目录

一、本节目标+效果展示

 二、先画出素材

1.先新建一个普通的代码 

2.画素材(一个头,两个耳朵,一个鼻子)

a.关于贴心的Unity

b.开始画素材

 三、了解移动的原理

  四、辅助物体的建立

五、画左耳朵

六、全部代码

七、作者的话


一、本节目标+效果展示

在制作软件的过程中,我们有时会希望有一些点出现在Scene中,他们能看见,能移动,能获取点的坐标,能在代码中编辑,但又不会出现在我们的场景里。就可以使用Gizmos。

"Gizmos" 这个词在英语中通常指的是小工具、小玩意儿或者小发明。

面板中的小地球可以控制用Gizmos的东西显示不显示。

图1 面板中的Gizmos控制器

1. 如图2所示,up用代码画了一个小熊,我们可以学到如何画熊。

图2 Gizmos画图

2. 如图3所示,up通过改变代码,就可以让三个圆球在球面上移动。

图3 球面移动

 二、先画出素材

1.先新建一个普通的代码 
using UnityEngine;
public class MyBear : MonoBehaviour
{
    void OnDrawGizmos()
    {
    }

    void OnDrawGizmosSelected()
    {     
    }
}

方法OnDrawGizmos: 

这个方法会一直执行,可以在这个方法里画一些想要的东西,会实时更新。

方法OnDrawGizmosSelected:

当点击挂脚本的物体时再执行

这里我们就一直执行,所以只用第一个代码。

2.画素材(一个头,两个耳朵,一个鼻子)

其实就是,一个大圆,两个黄色中圆,一个红色小圆。

a.关于贴心的Unity

都说了,今天是用Gizmos来画,肯定是准备好的。如图4所示。

图4 Gizmos方法
b.开始画素材

和平时画画的逻辑一样,先选颜色,然后绘图。如果不选颜色,就默认白色。

using UnityEngine;

public class MyBear : MonoBehaviour
{
    public void OnDrawGizmos()
    {
        //只在编辑器里执行
#if UNITY_EDITOR
        //画一个头
        //要白色的画笔
        Gizmos.color = Color.white;
        //画在0点,半径是1
        Gizmos.DrawSphere(new Vector3(0, 0, 0), 1);

        //画一个黄色的左耳朵
        Gizmos.color = Color.yellow;
        //画在0点,半径为0.3f
        Gizmos.DrawSphere(new Vector3(0, 0, 0), 0.3f);

        //画一个黄色的右耳朵
        //画在0点,半径为0.3f
        Gizmos.DrawSphere(new Vector3(0, 0, 0), 0.3f);

        //画一个红色的鼻子
        Gizmos.color = Color.red;
        //画在0点,半径为0.1f
        Gizmos.DrawSphere(new Vector3(0, 0, 0), 0.1f);
#endif
    }
}

 三、了解移动的原理

周围的圆球是以头圆球的中心为锚点,换句话说,当旋转时,按照头部中心点的x轴,y轴,z轴进行旋转。

按照固定一点的轴旋转,我们是有代码的。

public void RotateAround (Vector3 point, Vector3 axis, float angle);

以点point为中心,沿着某一个轴(x,y或者z),转angle度。

  四、辅助物体的建立

旋转的时候必须有东西在旋转,不能凭空转,所以我们需要建立一个假的圆心,一个假的以圆心为锚点旋转的点。转好了在对应位置去画点就行了。

因为我们的方法是一直执行的,所以,我们建立的物体,用完也要立马删掉。要不然你的场景里有有一大堆你新建的游戏物体。

//要画其他部位,但我们希望能以头为中心,1为半径
//先做一个物体当圆心
GameObject center = new GameObject();
//设置圆心位置
center.transform.position = new Vector3(0, 0, 0);

//建立旋转点
GameObject point = new GameObject();
//把point放在圆表面,因为圆的半径是1
point.transform.localPosition = new Vector3(0, 0, -1f);

//删掉定位点
DestroyImmediate(center);
DestroyImmediate(point);

五、画左耳朵

以上知识点就讲完了,我们以左耳朵为例,代码如下。

         //画一个头
        //要白色的画笔
        Gizmos.color = Color.white;
        Gizmos.DrawSphere(new Vector3(0, 0, 0), 1);

        //要画其他部位,但我们希望能以头为中心,1为半径
        //先做一个物体当圆心
        GameObject center = new GameObject();
        center.transform.position = new Vector3(0, 0, 0);

        //再做一个物体,来确定旋转中心
        GameObject point = new GameObject();

        //把point放在圆表面,因为圆的半径是1
        point.transform.localPosition = new Vector3(0, 0, -1f);

        //旋转到左耳的位置
        point.transform.RotateAround(center.transform.position, Vector3.right, leftEarRotation.x);
        point.transform.RotateAround(center.transform.position, Vector3.up, leftEarRotation.y);
        point.transform.RotateAround(center.transform.position, Vector3.forward, leftEarRotation.z);

        //画一个黄色的左耳朵
        Gizmos.color = Color.yellow;
        //此时point的位置,就是我希望的耳朵的位置 //半径为0.3f
        Gizmos.DrawSphere(point.transform.position, 0.3f);

        //把物体都销毁,只是定位用的,现在不需要了
        DestroyImmediate(center);
        DestroyImmediate(point);

这样我们就拥有了一个会动的左耳朵了!~如图5所示。

六、全部代码

using UnityEngine;

public class MyBear : MonoBehaviour
{
    //待会用来调
    public Vector3 leftEarRotation = new Vector3();
    public Vector3 rightEarRotation = new Vector3();
    public Vector3 noseRotation = new Vector3();

    public void OnDrawGizmos()
    {
#if UNITY_EDITOR
        //画一个头
        //要白色的画笔
        Gizmos.color = Color.white;
        Gizmos.DrawSphere(new Vector3(0, 0, 0), 1);

        //要画其他部位,但我们希望能以头为中心,1为半径
        //先做一个物体当圆心
        GameObject center = new GameObject();
        center.transform.position = new Vector3(0, 0, 0);

        //再做一个物体,来确定旋转中心
        GameObject point = new GameObject();

        //把point放在圆表面,因为圆的半径是1
        point.transform.localPosition = new Vector3(0, 0, -1f);

        //旋转到左耳的位置
        point.transform.RotateAround(center.transform.position, Vector3.right, leftEarRotation.x);
        point.transform.RotateAround(center.transform.position, Vector3.up, leftEarRotation.y);
        point.transform.RotateAround(center.transform.position, Vector3.forward, leftEarRotation.z);

        //画一个黄色的左耳朵
        Gizmos.color = Color.yellow;
        //此时point的位置,就是我希望的耳朵的位置 //半径为0.3f
        Gizmos.DrawSphere(point.transform.position, 0.3f);

        //旋转到右耳的位置
        point.transform.localPosition = new Vector3(0, 0, -1f);
        point.transform.eulerAngles = new Vector3(0, 0, 0);
        point.transform.RotateAround(center.transform.position, Vector3.right, rightEarRotation.x);
        point.transform.RotateAround(center.transform.position,Vector3.up, rightEarRotation.y);
        point.transform.RotateAround(center.transform.position, Vector3.forward, rightEarRotation.z);

        //画一个黄色的右耳朵
        //此时point的位置,就是我希望的耳朵的位置 //半径为0.3f
        Gizmos.DrawSphere(point.transform.position, 0.3f);

        //旋转到鼻子的位置
        point.transform.localPosition = new Vector3(0, 0, -1f);
        point.transform.eulerAngles = new Vector3(0, 0, 0);
        point.transform.RotateAround(center.transform.position,Vector3.right,noseRotation.x);
        point.transform.RotateAround(center.transform.position, Vector3.up, noseRotation.y);
        point.transform.RotateAround(center.transform.position, Vector3.forward, noseRotation.z);
        //画一个红色的鼻子
        Gizmos.color = Color.red;
        //此时point的位置,就是我希望的耳朵的位置 //半径为0.1f
        Gizmos.DrawSphere(point.transform.position, 0.1f);

        //把物体都销毁,只是定位用的,现在不需要了
        DestroyImmediate(center);
        DestroyImmediate(point);
#endif
    }
}

七、作者的话

可能你想问,这样做有什么用呢?比如,当你需要在地球上选城市之类的,常规的移动会非常麻烦,但如果有代码做辅助,就可以方便的选点。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

开源模型应用落地-LangChain试炼-LCEL-表达式语言(一)

一、前言 尽管现在的大语言模型已经非常强大,可以解决许多问题,但在处理复杂情况时,仍然需要进行多个步骤或整合不同的流程才能达到最终的目标。然而,现在可以利用langchain来使得模型的应用变得更加直接和简单。 LCEL是什么&…

AC自动机(查询)

上面讲了AC自动机是如何建树和建自动机的,这里要讲的是AC自动机的查询和各个数组的功能和作用。 其实AC自动机的查询和KMP算法是及其相近的,都是一个指针跑主串,另一个指针跑ne串(这里就是回跳边)。 话都说到这了&…

Linux C语言学习:数据类型

一、 为什么要引入数据类型 • 计算机中每个字节都有一个地址(类似门牌号) • CPU通过 地址 来访问这个字节的空间 0x20001103 1 0 0 1 0 0 1 1 0x20001102 1 1 1 0 1 1 1 0 0x20001101 1 1 1 1 0 1 0 1 0x20001100 0 …

南京观海微电子-----555函数信号发生器电路分析

电路图 整个电路的工作过程: 首先,555芯片通过外围电阻电容组成一个多谐振荡器,输出一个方波。 555多谐振荡器输出方波后,经电容C1耦合到由R3,C3组成的积分网络。输出三角波。这也是一个电容充放电的过程&#xff0c…

【Linux系统】进程信号

本篇博客整理了进程信号从产生到处理的过程细节,通过不同过程中的系统调用和其背后的原理,旨在让读者更深入地理解操作系统的设计与软硬件管理手段。 目录 一、信号是什么 1.以生活为鉴 2.默认动作与自定义动作 3.信号的分类、保存、产生 二、产生…

彻底吃透A*算法的最优性

下面的博客将主要介绍A*算法在扩展结点(这对于寻路时间很重要)和总代价(这对于保证最后解的最优性很重要)上的最优性,并将淡化对A *完备性的介绍。 A* 算法流程 A*算法的流程如下[1]: 并定义 f ( n ) f(n…

【云原生_K8S系列】Kubernetes 控制器简介

概述 Kubernetes是一个开源的容器编排平台,旨在自动化部署、扩展和管理容器化应用。Kubernetes 的核心组件之一是控制器(Controller),它负责确保集群中的实际状态与用户定义的期望状态一致。控制器是 Kubernetes 控制平面的一个重…

GaussDB的数种形态

GaussDB作为一种新兴的关系型数据库产品,似乎有点让人摸不着头脑。有朋友问我GaussDB单机版怎么样,有人说GaussDB是分布式数据库,还有人说它是云数据库,还有人会把GaussDB和华为的数据仓库GaussDB DWS混为一谈。确实,公…

密码学基本概念(补充)

BiBa模型的*特性规则:主体不能修改更高完整级的客体(主题不能向上写) Diffie-Hellman密钥交换协议的安全性基于求解离散对数的困难性,既对于C^d M mod P,在已知C和P的前提下,由d求M很容易,但是…

取代Windows的系统复制粘贴等文件处理

TeraCopy 可以到官网下载也可以通过应用商店下载 主要作用 : 取代Windows的系统复制粘贴等文件处理 常规窗口 点击第一排最左侧的按钮会显示这个窗口, 显示所以文件操作记录 , 这个也是我装这个软件的原因之一, 框选的是当前正在进行的 当执行复制粘贴时会自动出现, 让自行…

从零开始:如何通过美颜SDK构建自己的直播美颜工具

今天,我将详细介绍如何通过美颜SDK从零开始构建自己的直播美颜工具。 一、了解美颜SDK 什么是美颜SDK 开发者可以通过集成SDK,快速在应用中实现这些功能,而无需从头编写复杂的图像处理算法。 选择合适的美颜SDK 选择时可以根据以下几个方…

RAG 高效应用指南 :Query 理解

前言 构建一个检索增强生成 (Retrieval-Augmented Generation, RAG) 应用的 PoC(概念验证,Proof of Concept)过程相对简单,但要将其推广到生产环境中则会面临多方面的挑战。这主要是因为 RAG 系统涉及多个不同的组件,…

使用Nginx正向代理让内网主机通过外网主机访问互联网

目录 环境概述 流程说明 在外网服务器上安装部署nginx 安装前准备 下载nginx 编译安装nginx 开始配置正向代理 创建systemd服务单元文件,用于管理Nginx服务的启动、停止和重新加载 启动nginx 代理服务器本地验证 内网服务器验证 将代理地址添加到环境变量中…

38. 【Java教程】日期和时间处理

本小节我们将学习 Java 中的日期和时间,日期和时间在我们的实际开发中非常常用,例如用户的注册、数据的增删改、对敏感信息的操作等等都需要记录下日期和时间。通过本小节的学习,你将了解到什么是日期、什么是时间、什么是时区,Ja…

查看云是基于openstack是哪一个版本开发的?

进入版本发行网站: OpenStack Releases: OpenStack Releases 进入云的后台,查看例如nova的版本号 rpm -qa | grep nova 查看到nova的版本号是21版本,点开releases中例如Ussuri查看nova的版本号,是21,则该云是基于U…

数据分析技术---对比K-means,密度分析和层次聚类性能

一、数据集选择: Iris数据集。 二、实验代码: #对比k-means、密度聚类和层次聚类性能import matplotlib.pyplot as pltfrom sklearn import datasetsfrom sklearn.cluster import KMeans, DBSCAN, AgglomerativeClusteringfrom sklearn.preprocessing i…

STM32自己从零开始实操04:显示电路原理图

一、TFT-LCD 屏接口 1.1指路 以下是该部分的设计出来后的实物图,我觉得看到实物图可能更方便理解这部分的设计。 图1 实物图 这部分设计的是一个屏幕的接口,很简单。使用的屏幕是:2.8inch 16BIT Module MRB2801。 1.2数据手册 &#xff0…

metasploit上线之后可以使用的命令

1. 通用控制命令 meterpreter > essions -k 1 # 通过ID号杀死一个会话 meterpreter > background # 将会话放入后台 meterpreter > getuid/getpid # 查询用户权限与PID meterpreter > sysinfo # 查看目标…

智慧校园教学模式的崛起:优化学习体验

在当今数字化时代,智慧校园教学模式正在成为教育界的热门话题。随着科技的不断发展,传统的教学方式已经无法满足现代学生的需求。智慧校园教学模式以其灵活性、互动性和个性化的特点,正逐渐改变着教育的面貌。 首先,智慧校园教学模…

R_AARCH64_ADR_PREL_PG_HI21问题说明

目录 问题现象: 问题原因 问题机理 问题现象: 客户现场加载out文件出现如下问题: 打印“Relocation of type ‘R_AARCH64_ADR_PREL_PG_HI22…..’”,明确是ARDP指令引起的问题 问题原因 ARDP的寻址范围是4GB范围,加载的位置…