Unity基础——Transform组件
一.一些比较重要的点
1. 首先编辑器面板中的位置信息指的是物体相对于父物体的坐标(本地坐标),如果物体没有父物体,则其父物体可以看作是世界,则该坐标实际上是世界坐标;
2.如果在脚本中调用transform组件的position属性,其是一个Vector3类型的对象,指的是世界坐标。即不论其是否有父物体,都指的是其世界坐标。
using UnityEngine;
class Script1 : MonoBehaviour
{
void Start()
{
var pos = transform.position; //指的是世界坐标
var localPos = transform.localPosition; //如果要获得本地坐标,使用localPosition
var u = Vector3.up; //世界坐标(0, 1, 0), z轴一般是物体朝向, down, forward同理
var uu = transform.forward; //本地坐标(0, 0, 1)标准化为世界坐标
}
}
3.transform的position无法直接改变,可以用下面两种方式改变:
using UnityEngine;
class Script2 : MonoBehaviour
{
void start()
{
//方法一.直接赋新值
transform.position = new Vector3(transform.position.x + 10, transform.y, transform,z);
//方法二.提出赋值
Vector3 vec = transform.localPosition; //Vector3是结构体类型
vec.x = 100;
transform.localPosition = vec;
}
}
4.求两个向量之间的距离
using UnityEngine;
class Script3 : MonoBehaviour
{
void Start()
{
float dis = Vector.Distance(Vector3.up, Vector.up + Vector.left);
}
}
5.不要多次修改一个物体的坐标,而是直接在一个Vector3对象上修改后再赋值给这个物体,因为修改物体的坐标需要更新其子物体的坐标,也会增大渲染的负担,增大开销。
二.位移
1. 直接计算位移并更新坐标
比如要向前移动:
using UnityEngine;
class Script4 : MonoBehaviour
{
private float speed;
void Update()
{
transform.position = transform.position + speed * Time.deltaTime * transform.forward;
}
}
2.使用Unity提供的API
private void Update()
{
//1.朝着世界坐标系的z轴移动
transform.Translate(speed * Time.deltaTime * Vector3.forward, Space.World);
//2.朝着本地坐标系的z轴移动
transform.Translate(speed * Time.deltaTime * transform.forward, Space.World);
//3.朝着自己的面朝向移动
transform.Translate(speed * Time.deltaTime * Vector3.forward, Space.Self);
}
三.旋转
using System.Collections;
using System.Collections.Generic;
using System.Numerics;
using UnityEngine;
using Vector3 = UnityEngine.Vector3;
public class Transform02 : MonoBehaviour
{
public float rotateSpeed; //旋转速度
// Start is called before the first frame update
private void Start()
{
print(transform.eulerAngles); //打印世界旋转角度
print(transform.localEulerAngles); //打印本地旋转角度
}
// Update is called once per frame
private void Update()
{
//Rotate()方法某人是以自身坐标系为Space旋转
//1.相对于自身的y轴旋转
//transform.Rotate(Vector3.up, Time.deltaTime * rotateSpeed, Space.Self);
// transform.Rotate(Time.deltaTime * rotateSpeed * Vector3.up, Space.Self); 等效
// transform.Rotate(Time.deltaTime * rotateSpeed * transform.up, Space.World); 等效
//2.相对于世界的y轴进行旋转,个人推荐,参数比较清楚
/// <summary>
/// 使物体绕着某个轴以某个速度旋转
/// </summary>
/// <param name="rotateAxis">旋转轴</param>
/// <param name="rotateSpeed">旋转速度</param>
/// <param name="space">坐标系</param>
transform.Rotate(Vector3.up, Time.deltaTime * rotateSpeed, Space.World);
//3.相对于某个点旋转(参数:点,轴,旋转速度)
transform.RotateAround(Vector3.zero, Vector3.up + Vector3.right, rotateSpeed * Time.deltaTime);
print(Vector3.Distance(transform.position, Vector3.zero));
}
}
四.坐标与变换
直接看代码
标签:transform,up,Vector3,Transform,世界坐标,Unity,坐标,组件,using From: https://www.cnblogs.com/U3dever/p/18206803