目录
一、本节目标+效果展示
二、先画出素材
1.先新建一个普通的代码
2.画素材(一个头,两个耳朵,一个鼻子)
a.关于贴心的Unity
b.开始画素材
三、了解移动的原理
四、辅助物体的建立
五、画左耳朵
六、全部代码
七、作者的话
一、本节目标+效果展示
在制作软件的过程中,我们有时会希望有一些点出现在Scene中,他们能看见,能移动,能获取点的坐标,能在代码中编辑,但又不会出现在我们的场景里。就可以使用Gizmos。
"Gizmos" 这个词在英语中通常指的是小工具、小玩意儿或者小发明。
面板中的小地球可以控制用Gizmos的东西显示不显示。
1. 如图2所示,up用代码画了一个小熊,我们可以学到如何画熊。
2. 如图3所示,up通过改变代码,就可以让三个圆球在球面上移动。
二、先画出素材
1.先新建一个普通的代码
using UnityEngine;
public class MyBear : MonoBehaviour
{
void OnDrawGizmos()
{
}
void OnDrawGizmosSelected()
{
}
}
方法OnDrawGizmos:
这个方法会一直执行,可以在这个方法里画一些想要的东西,会实时更新。
方法OnDrawGizmosSelected:
当点击挂脚本的物体时再执行
这里我们就一直执行,所以只用第一个代码。
2.画素材(一个头,两个耳朵,一个鼻子)
其实就是,一个大圆,两个黄色中圆,一个红色小圆。
a.关于贴心的Unity
都说了,今天是用Gizmos来画,肯定是准备好的。如图4所示。
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
}
}
七、作者的话
可能你想问,这样做有什么用呢?比如,当你需要在地球上选城市之类的,常规的移动会非常麻烦,但如果有代码做辅助,就可以方便的选点。