Contents

位移(Transform)

计算位移量

路程=方向*时间*速度

方式一:自己计算

自己当前的位置+向量(方向)*速度*每一帧需要的时间 = 1秒移动1

transform.position = transform.position + transform.forward(本地坐标向前 对应世界坐标的向量) * 1 * Time.deltaTime;
//transform.forward(本地坐标向前 对应世界坐标的向量)

方法二:API移动

//参数一:位移多少 方向*速度*时间
//参数二:表示相对坐标系 默认参数是 物体自己的坐标系Space.Self 可选世界坐标Space.World
transform.Translate(Vector3.forward*1*Time.deltaTime);
//也可以使用世界坐标系 使用transform.forward作为向量
transform.Translate(transform.forward*1*Time.deltaTime,Space.World);

角度和旋转

  • 和position一样也有相对世界坐标的角度和相对父对象的角度
  • transform.rotation的值是一个四元数 面板上显示的是欧拉角可通过transform.eulerAngles参数获取或者修改
  • 和设置位置一样不可以单独设置xyz transform.eulerAngles.x = 50
  • 通过localEulerAngles获取的角度不会是负数虽然面板显示负数,只能获得0~360之间的数

修改角度(欧拉角)

//世界坐标角度
transform.eulerAngles = new Vector3(0,1,0);
//相对父对象角度
transform.localEulerAngles = new Vector3(0,1,0);

通过API旋转

//默认使用自己的坐标系 进行旋转
transform.Rotate(Vector3.forward * 30 * Time.deltaTime)
//使用世界坐标系进行旋转
tank.transform.Rotate(Vector3.forward * 30 * Time.deltaTime,Space.World);

相对于某个轴旋转

//默认使用自己的坐标系 Z轴旋转
transform.Rotate(Vector3.forward,30*Time.deltaTime);
//默认使用世界坐标系 Z轴旋转
transform.Rotate(Vector3.forward,30*Time.deltaTime,Space.World);

相对于某一个点旋转

//第一个参数 围绕旋转的点(是一个世界坐标)
//第二个参数 旋转的轴
//旋转的速度
transform.RotateAround(Vector3.zero,Vector3.up, 10 * Time.deltaTime);

缩放

  • 缩放也分成相对世界坐标系的缩放 和相对本地坐标系的缩放(父对象)
  • 也不可以直接修改xyz transform.localScale.x=2
  • 相对世界坐标系的缩放只可以获得 不可以修改
//相对世界坐标系 不可修改
Vector3 v1 = transform.lossyScale;
//相对本地坐标系
transform.localScale = new Vector3(3,3,3);

看向

让一个对象的面朝向 可以一直看向某一个点或者某一个对象

//看向一个点 相对于世界坐标系
transform.LookAt(Vector3.zero);
//看向一个对象
transform.LookAt(obj.transform);

父子对象

获取和设置父对象

//获取父对象
transform.parent;
//设置父对象为空
transform.parent = null;
//通过api设置
transform.SetParent(null);
//是否保留世界坐标的位置角度缩放信息 默认true(会重新计算 本地坐标下的位置信息 设置父对象后物体位置不会改变)
//不保留则会把世界坐标的属性加到本地坐标上
transform.SetParent(obj,false);

和所有的子对象断绝关系

transform.DetachChildren();

获取子对象

  • transform的Find方法是可以找到失活的对象的 GameObject的Find不能找到失活对象
  • 只能找到自己的子对象 不能找到子对象的子对象
  • 相对GameObject查找来说 效率会高一些
transform.Find("childname");

遍历子对象

  • 失活的子对象也算数量
  • 无法找到子对象的子对象
//获取子对象的数量
int count = transform.childCount;
//通过索引号 去得到自己对应的子对象
for (int i = 0; i < count; i++)
{
    //通过索引号 来获取子对象 返回值是transform
    Debug.Log(transform.GetChild(i).name);
}

子对象的操作

判断一个对象是不是另一个对象的子节点

if(son.IsChildOf(fater)){
	print("是我儿子");
}

得到自己的子节点编号

transform.GetSiblingIndex();

设置子节点的编号

//设置为第一个子节点
transform.SetAsFirstSibiling();
//设置为最后一个子节点
transform.SetAsLastSibiling();
//设置自己的子节点编号
transform.SetSibilingIndex();

父子关系练习题

写一个扩展Transform的方法 要求对子对象的名字进行排序

//扩展方法需要写成静态类
public static class Tools{
    //静态方法
    //参数填写需要扩展的类
	public static void Sort(this Transform obj){
        List<Transform> childList = new List<Transform>();
        for( int i = 0 ; i < obj.childCount ; i++ ){
            childList.Add(obj.GetChild(i));
        }
        childList.Sort((a,b)=>{
            if(a.name.Length>b.name.Length){
                return 1;
            }else{
                return -1
            }
        });
        for(int i = 0; i < childList.count; i++){
           	childList(i).SetSibilingIndex(i);
        }
    }
}

写一个扩展Transform的方法 要求传入名字查询子对象 子对象的子对象也要找到

//扩展方法需要写成静态类
public static class Tools{
	public static Transform FindChild(this Transform feter , string name){
        Transform target = feter.Find(name);
        if(tagert!=null) return target;
        for(int i = 0; i < feter.childCound; i++){
            target = feter.GetChild(i).FindChild(name);
            if(target != null) return target;
        }
        return target;
    }
}