当前位置: 首页 > article >正文

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);



    }
}


http://www.kler.cn/a/527633.html

相关文章:

  • 苍穹外卖——数据统计
  • 在godot中接入大模型api,实现npc的自动对话
  • 服务器虚拟化实战:架构、技术与最佳实践
  • 【微服务与分布式实践】探索 Eureka
  • Fiddler(一) - Fiddler简介_fiddler软件
  • Rust语言进阶之文件处理:std::fs用法实例(九十九)
  • 【Pandas】pandas Series diff
  • C语言指针专题二 -- 字符指针与字符串
  • 翻译: Anthropic CEO:DeepSeek-R1是人工智能领域的革命吗?二
  • 一文读懂fgc之cms
  • web安全测试之 xss攻击_request
  • [openwrt] odhcpd ra_management Vs ra_flags 和 ra_slaac
  • 守护进程
  • 代码随想录34 动态规划
  • C动态库的生成与在Python和QT中的调用方法
  • 猿人学web 19题(js逆向)
  • 为AI聊天工具添加一个知识系统 之70 详细设计 之11 维度运动控制的应用:上下文受控的自然语言
  • Git进阶之旅:Git 分支管理
  • gcc和g++的区别以及明明函数有定义为何链接找不到
  • 计算机网络——流量控制
  • CSS 溢出内容处理:从基础到实战
  • 解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路
  • [EAI-029] RoboVLMs,基于VLM构建VLA模型的消融研究
  • Ubuntu 系统,如何使用双Titan V跑AI
  • Learning Vue 读书笔记 Chapter 3
  • 每日一博 - 三高系统架构设计:高性能、高并发、高可用性解析