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点,半径是1Gizmos.DrawSphere(new Vector3(0, 0, 0), 1);//画一个黄色的左耳朵Gizmos.color = Color.yellow;//画在0点,半径为0.3fGizmos.DrawSphere(new Vector3(0, 0, 0), 0.3f);//画一个黄色的右耳朵//画在0点,半径为0.3fGizmos.DrawSphere(new Vector3(0, 0, 0), 0.3f);//画一个红色的鼻子Gizmos.color = Color.red;//画在0点,半径为0.1fGizmos.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放在圆表面,因为圆的半径是1point.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.3fGizmos.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放在圆表面,因为圆的半径是1point.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.3fGizmos.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.3fGizmos.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.1fGizmos.DrawSphere(point.transform.position, 0.1f);//把物体都销毁,只是定位用的,现在不需要了DestroyImmediate(center);DestroyImmediate(point);
#endif}
}

七、作者的话

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

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

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

相关文章

Ceph入门到精通-Ceph OSD 磁盘在系统重启后无法识别处理步骤

如果Ceph OSD磁盘在系统重启后无法识别,你可以按照以下步骤进行检查和解决: 1. 检查硬件状态 物理检查:首先进行物理检查,确保磁盘没有物理损坏,数据线和电源线连接正常。S.M.A.R.T状态:使用smartctl命令检查磁盘的S.M.A.R.T状态,以确定是否有硬件问题。2. 确认磁盘识别…

OpenCv之简单的人脸识别项目(特征标注页面)

人脸识别 准备八、特征标注页面1.导入所需的包2.设置窗口2.1定义窗口外观和大小2.2设置窗口背景2.2.1设置背景图片2.2.2创建label控件 3.定义两个全局变量4.定义选择图片的函数4.1函数定义和全局变量声明4.2打开文件对话框并获取文件路径4.3处理图片并创建标签4.4显示图像 5.定…

MK米客方德 SD NAND与文件系统:技术解析与应用指南

随着数字存储技术的飞速发展,SD NAND(贴片式T卡)已成为我们日常生活中不可或缺的存储工具。我们将深入探讨SD NAND的文件系统,特别是SD 3.0协议支持的文件系统类型,以及它们在实际应用中的作用和用户可能遇到的问题。 MK米客方德的…

kafka-集群-主题创建

文章目录 1、集群主题创建1.1、查看 efak1.2、创建 主题 my_topic1 并建立6个分区并给每个分区建立3个副本1.2.1、查看 my_topic1 的详细信息 1.3、停止 kafka-01实例,端口号为 9095 1、集群主题创建 1.1、查看 efak 已经有三个kafka实例 1.2、创建 主题 my_topic1…

【面试干货】索引的作用

【面试干货】索引的作用 1、索引的作用 💖The Begin💖点点关注,收藏不迷路💖 1、索引的作用 索引 可以协助 快速查询、更新数据库表中数据。 通过使用索引,数据库系统能够快速定位到符合查询条件的数据,提…

为什么需要对政府工作绩效进行第三方评估?

政府工作绩效的第三方评估具有重要意义,能够在多个方面对政府运作和公共管理产生积极影响。以下是第三方评估的主要意义: 一、提升政府透明度和公信力 通过第三方独立评估,政府的工作绩效和决策过程变得更加公开透明,有助于增强…

人工智能--Foxmail邮箱使用方法

目录 🍉Foxmail全面指南 🍉下载与安装 🍈下载软件 🍈安装软件 🍉配置邮箱 🍈启动 Foxmail 🍈添加邮箱账户 🍈手动配置邮箱 🍍接收邮件服务器 (IMAP/POP3) &…

Elastic Platform 8.14:ES|QL 正式发布、静态加密和向量搜索优化

作者:来自 Elastic Gilad Gal, Tyler Perkins, Alex Chalkias, Trevor Blackford, Ninoslav Miskovic, Fabio Busatto, Aris Papadopoulos Elastic Platform 8.14 提供了 Elasticsearch 查询语言 (ES|QL) 的正式发行版 (GA) — Elastic 中数据探索和操作的未来。它还…

# ROS 获取激光雷达数据 (Python实现)

ROS 获取激光雷达数据 (Python实现) 实现思路 构建一个新的软件包,包名叫做lidar_pkg在软件包中新建一个节点,节点名叫做lidar_node.py在节点中,向ROS大管家rospy申请订阅话题/scan,并设置回调函数为Lidarcallback()构建回调函数…

java:使用shardingSphere访问mysql的分库分表数据

# 创建分库与分表 创建两个数据库【order_db_1、order_db_2】。 然后在两个数据库下分别创建三个表【orders_1、orders_2、orders_3】。 建表sql请参考: CREATE TABLE orders_1 (id bigint NOT NULL,order_type varchar(255) NULL DEFAULT NULL,customer_id bigi…

Docker:技术架构演进

文章目录 基本概念架构演进单机架构应用数据分离架构应用服务集群架构读写分离/主从分离架构冷热分离架构垂直分库微服务容器编排架构 本篇开始进行对于Docker的学习,Docker是一个陌生的词汇,那么本篇开始就先从技术架构的角度出发,先对于技术…

【51单片机】智能百叶窗项目

文章目录 功能演示:前置要求:主要功能:主要模块:主函数代码: 具体的仿真程序和代码程序已经免费放置在资源中,如有需要,可以下载进行操作。 功能演示: 前置要求: 编译软…

【NoSQL】Redis练习

1、redis的编译安装 systemctl stop firewalld systemctl disable firewalld setenforce 0 yum install -y gcc gcc-c make wget cd /opt wget https://download.redis.io/releases/redis-5.0.7.tar.gz tar zxvf redis-5.0.7.tar.gz -C /opt/cd /opt/redis-5.0.7/ # 编译 make…

【全开源】CMS内容管理系统(ThinkPHP+FastAdmin)

基于ThinkPHPFastAdmin的CMS内容管理系统,自定义内容模型、自定义单页、自定义表单、专题、统计报表、会员发布等 提供全部前后台无加密源代码和数据库私有化部署,UniAPP版本提供全部无加密UniAPP源码​ 🔍 解锁内容管理新境界:C…

Typesense-开源的轻量级搜索引擎

Typesense-开源的轻量级搜索引擎 Typesense是一个快速、允许输入错误的搜索引擎,用于构建愉快的搜索体验。 开源的Algolia替代方案& 易于使用的弹性搜索替代方案 官网: https://typesense.org/ github: https://github.com/typesense/typesense 目前已有18.4k…

阅读笔记:Multi-threaded Rasterization in the Chromium Compositor

Multi-threaded Rasterization in the Chromium Compositor PPT 原始链接: https://docs.google.com/presentation/d/1nPEC4YRz-V1m_TsGB0pK3mZMRMVvHD1JXsHGr8I3Hvc/edit?uspsharing PPT主要介绍了Chromium浏览器中使用多线程光栅化(Impl-side painting)的机制&a…

Python自动化发送邮件如何实现?怎么配置?

Python自动化发送邮件需要注意什么?邮件群发的技巧? 无论是个人使用还是企业需求,电子邮件的发送都是必不可少的。而Python作为一门功能强大的编程语言,可以通过自动化脚本实现批量发送邮件,从而提高工作效率。AokSen…

【外汇天眼】选择外汇EA的关键:策略适配、风险控制与稳定性评估

外汇EA(Expert Advisor)是外汇交易市场中广泛使用的自动化交易系统。它们通过预定义的规则和算法自动执行交易,旨在为交易者提供便捷的交易体验,同时提高交易效率和准确性。本文将从策略选择、风险控制和稳定性评估三个方面&#…

更改晶振后如何修改配置

GD32官方提供的固件库中使用的晶振配置一般为8M或25M,如果读者使用其他频率的晶振如何修改配置呢?本文为大家讲解如何修改。 以GD32F303为例,官方固件库中的晶振及时钟配置代码如下,改配置代码为使用外部8M晶振倍频到120M时钟。 …

Excel 生成所在月份的每一天列表

Excel 的 A2 格是日期 A1Fecha201/03/24 需要生成该日期所在月份的每一天的列表 A1WholeMonth201/03/24302/03/24403/03/24504/03/24605/03/24706/03/24807/03/24908/03/241009/03/241110/03/241211/03/241312/03/241413/03/241514/03/241615/03/241716/03/241817/03/241918…