unity学习25:用 transform 进行旋转和移动,简单的太阳地球月亮模型,以及父子级关系
目录
备注内容
1游戏物体的父子级关系
1.1 父子物体
1.2 坐标关系
1.3 父子物体实际是用 每个gameobject的tranform来关联的
2 获取gameObject的静态数据
2.1 具体命令
2.2 具体代码
2.3 输出结果
3 获取gameObject 的方向
3.1 游戏里默认的3个方向
3.2 获取方向代码
3.3 输出
4 游戏里的 旋转,朝向
4.1 始终朝向某点:transform.LookAt()
4.2 自转 transform.Rotate()
4.3 公转 transform.RotateAround()
4.4 自转+公转的 Sun- Earth- Moon 效果
5 游戏里的直线移动 transform.Translate()
5 游戏里 gameObject的父子关系
备注内容
- 注释 //
- 注释 /* */ 大段block注释
1游戏物体的父子级关系
1.1 父子物体
- 游戏物体的父子级关系
- 实际是用 每个gameobject的tranform来关联的
1.2 坐标关系
- tranform.position //这个是unity里的绝对位置
- tranform.localPosition //这个是相对于父物体的位置,也是unity编辑器里显示的坐标位置
1.3 父子物体实际是用 每个gameobject的tranform来关联的
- 父子物体实际是用 每个gameobject的tranform来关联的
2 获取gameObject的静态数据
2.1 具体命令
//获取位置
Debug.Log(transform.position); // 返回一个Vector3
Debug.Log(transform.localPosition); // 返回一个Vector3
//获取旋转的四元数,和欧拉角
Debug.Log(transform.rotation); // 返回四元数
Debug.Log(transform.localRotation);
Debug.Log(transform.eulerAngles); // 返回一个Vector3
Debug.Log(transform.localEulerAngles); // 返回一个Vector3
//获取缩放
Debug.Log(transform.localScale); // 返回一个Vector3
2.2 具体代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransformTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//获取位置
Debug.Log(transform.position);
Debug.Log(transform.localPosition);
//获取旋转的四元数,和欧拉角
Debug.Log(transform.rotation);
Debug.Log(transform.localRotation);
Debug.Log(transform.eulerAngles);
Debug.Log(transform.localEulerAngles);
//获取缩放
Debug.Log(transform.localScale);
}
// Update is called once per frame
void Update()
{
}
}
2.3 输出结果
3 获取gameObject 的方向
3.1 游戏里默认的3个方向
- z 蓝色,forward
- X 红色, right
- Y 绿色, up
3.2 获取方向代码,如transform.forward
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransformTest : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//获取位置
Debug.Log(transform.position);
Debug.Log(transform.localPosition);
//获取旋转的四元数,和欧拉角
Debug.Log(transform.rotation);
Debug.Log(transform.localRotation);
Debug.Log(transform.eulerAngles);
Debug.Log(transform.localEulerAngles);
//获取缩放
Debug.Log(transform.localScale);
//获取方向向量
Debug.Log(transform.forward);
Debug.Log(transform.right);
Debug.Log(transform.up);
}
// Update is called once per frame
void Update()
{
}
}
3.3 输出
4 游戏里的 旋转,朝向
4.1 始终朝向某点:transform.LookAt()
//一直面向/朝向某个点
Vector3 pos1=new Vector3(0,0,0);
transform.LookAt(pos1);
- transform.LookAt(Vector3)
- 参数必须是1个 Vector3
- 而Vector3 变量,定义时,必须new1个实例出来用
- Vector3 pos1=new Vector3(0,0,0);
- 测试时注意:如果测试的GB是个球
- 其实,这个物体的3个轴还是不变的,只是球上面的旋转曲线可以看出来,因为始终朝向某个点,所以其实球自身发生了旋转。
4.2 自转 transform.Rotate()
//自转
transform.Rotate(Vector3.up,3f);
- transform.Rotate(Vector3.up,3f);
- 参数1:坐标轴
- 参数2:速度,注意浮点数需要时0.3f这样
4.3 公转 transform.RotateAround()
//公转
transform.RotateAround(Vector3.zero,Vector3.up,0.1f);
- transform.RotateAround(Vector3.zero,Vector3.up,0.1f);
- 参数1:公转的中心点
- 参数2:坐标轴
- 参数3:速度,注意浮点数需要时0.3f这样
4.4 自转+公转的 Sun- Earth- Moon 效果
- 上面是代码测试效果
- Sun放在 Vector(0,0,0) 点
- Earth 挂代码 TransformTest1
- Moon 挂代码 TransformTest1
TransformTest1
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransformTest1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//一直面向/朝向某个点
Vector3 pos1=new Vector3(0,0,0);
transform.LookAt(pos1);
//自转
transform.Rotate(Vector3.up,3f);
//公转
transform.RotateAround(Vector3.zero,Vector3.up,0.1f);
}
}
TransformTest2 其实和 TransformTest1差不多
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransformTest2 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
//自转
transform.Rotate(Vector3.up,1f);
//公转
transform.RotateAround(transform.parent.gameObject.transform.position,Vector3.up,0.5f);
}
}
5 游戏里的直线移动 transform.Translate()
//直线移动
transform.Translate(Vector3.forward*0.1f);
5 游戏里 gameObject的父子关系
- 修改 Earth的脚本
- //获取父物体,父物体只有1个
- Debug.Log(transform.parent.gameObject);
- //子物体个数
- Debug.Log(transform.childCount);
- //解除与子物体的关系
- transform.DetachChildren();
- //获取子物体,可能有很多个
- Transform tran1=transform.Find("Moon");
- tran1=transform.GetChild(0);
- //判断一个物体是不是另外一个物体的子物体
- //transform默认就是this.transform
- bool res=tran1.IsChildOf(transform);
- Debug.Log(res);
- //设置父物体(设置自身为自己的父物体--没意义只是测试)
- tran1.SetParent(transform);
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TransformTest1 : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
//获取父物体,父物体只有1个
Debug.Log(transform.parent.gameObject);
//子物体个数
Debug.Log(transform.childCount);
//接触与子物体的关系
transform.DetachChildren();
//获取子物体,可能有很多个
Transform tran1=transform.Find("Moon");
tran1=transform.GetChild(0);
//判断一个物体是不是另外一个物体的子物体
//transform默认就是this.transform
bool res=tran1.IsChildOf(transform);
Debug.Log(res);
//设置父物体(设置自身为自己的父物体--没意义只是测试)
tran1.SetParent(transform);
}
// Update is called once per frame
void Update()
{
//一直面向/朝向某个点
Vector3 pos1=new Vector3(0,0,0);
transform.LookAt(pos1);
//自转
transform.Rotate(Vector3.up,3f);
//公转
transform.RotateAround(Vector3.zero,Vector3.up,0.1f);
}
}