unity3d入门教程四

news2024/11/13 12:18:59

unity3d入门教程四

  • 10.1坐标与旋转
  • 10.2物体的运动
  • 10.3(练习)掉头飞行
  • 11.1向量
  • 11.2向量间运算
  • 11.3向量夹角
  • 11.4物体的指向
  • 11.5(练习)飞向目标
  • 12.1屏幕坐标
  • 12.2屏幕的边界

10.1坐标与旋转

在这里插入图片描述

比如,节点的坐标用 Vector3 类型表示

transform.position = new Vector3(0, 1.0f, 0);

在这里插入图片描述

比如,

  transform.position = new Vector3(0, 1.0f, 0);
  transform.eulerAngles = new Vector3(0, 0, 90f);

在这里插入图片描述

给子弹指定本地坐标:

transform.localPosition = new Vector3( 0, 1.0f, 0);

飞机发射子弹认为其有相对的运动关系

本地坐标也是相对坐标,相对于父节点的坐标,并不是世界坐标即相对于整个场景的坐标

相对旋转如下所示
在这里插入图片描述

结论:通过

transform.eulerAngles= new Vector3(x,y,z)

设置的角度是绝对角度(类似于绝对路径)

结论:通过

 transform.localEulerAngles= new Vector3(0f,agent,0f);

设置的角度是相对角度(类似于相对路径)

10.2物体的运动

Update()刷新时调用
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.3(练习)掉头飞行

在这里插入图片描述
在这里插入图片描述

示例代码 (也可以在项目源码的 Assets \ Script \ 目录下查看 )

public class MyJet : MonoBehaviour
{
    private bool upward = true; // 飞行的方向

    // Start is called before the first frame update
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
{
//整个camera总高度10,飞机在中间上走5个格就到边界了
//如果到达上边界就换向
        if(upward && transform.position.y > 5 )
        {
            upward = false;
            transform.localEulerAngles = new Vector3(0, 0, 180);
        }
//若到达下边界就换向
        if(!upward && transform.position.y < -5)
        {
            upward = true;
            transform.localEulerAngles = new Vector3(0, 0, 0);
        }

        float step = 1.6f * Time.deltaTime; // 每帧移动的距离
        transform.Translate(0, step, 0, Space.Self );
    }
}

11.1向量

运动计算基础向量运算
控制物体运动,方向要通过向量运算计算得到
在这里插入图片描述
在这里插入图片描述

直接使用 API 求长度:

float len = v.magnitude;

其中V是自定义的向量

1 向量的长度

Vector3 a = new Vector3(2f, 2f, 0);
float len = a.magnitude;
Debug.Log("长度: " + len);

注意,C# 里的‘属性’,其实内部是一个 Getter/ Setter 方法。
在这里插入图片描述
在这里插入图片描述

2 向量标准化

 Vector3 a = new Vector3(2f, 2f, 0);
    Vector3 b = a.normalized;
    Debug.Log("标准化为: " + b.ToString("F3") );

 Debug.Log("标准化为: " + b );

如果直接打印显示不全

几个常用的标准向量 (静态常量)

Vector3.right  ,即 Vector3 (1, 0, 0)
Vector3.up  ,   即 Vector3 (0, 1, 0) 
Vector3.forward  ,即 Vector3 (0, 0, 1)

11.2向量间运算

两个向量间的运算

减法是经常用到的用来求两者之间的距离
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

乘法分为3种:
标量乘法 b = a * 2 (x,y,z分别成2,相当于变长变短)
点积 c = Vector3.Dot ( a, b )
差积 c = Vector3.Cross ( a, b )

在这里插入图片描述

本示例代码挂载到飞机上,飞机和球物体都是根节点下的节点

示例代码

GameObject target = GameObject.Find("球");

// 目标位置
Vector3 p2 = target.transform.position;

// 自己位置
Vector3 p1 = this.transform.position;

// 方向向量
Vector3 direction = p2 - p1;

Debug.Log("物体间的距离: " + direction.magnitude);

11.3向量夹角

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

示例: 求从 a 到 b 的夹角

Vector3 a = new Vector3(2, 2, 0);
Vector3 b = new Vector3(-1, 3, 0);
float angle = Vector3.SignedAngle(a, b, Vector3.forward);

要注意此处求得是带正负号的夹角
若只求夹角不含方向即正负号如下

 float angle = Vector3.Angle(a, b);

求从a到b 的夹角

Vector3 a = new Vector3(2, 2, 0);

Vector3 b = new Vector3(-1, 3, 0);

// float angle = Vector3.Angle(a, b);	//只求夹角无方向正负

float angle = Vector3.SignedAngle(a, b, Vector3.forward);	//有正负

求从b到a的夹角

float angle = Vector3.SignedAngle(b, a, Vector3.forward);

求从a与 x轴正向的夹角

float angle = Vector3.SignedAngle(a, Vector3.right, Vector3.forward);//a到x轴正向逆时针,-45度

其中,Vector3.right 就是指向X轴正方向的单位向量

11.4物体的指向

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注意物体的坐标向量和世界坐标向量是不同的

在这里插入图片描述

1 打印显示物体的3个坐标轴向量

Debug.Log("x轴向量: " + transform.right.ToString("F3"));
Debug.Log("Y轴向量: " + transform.up.ToString("F3"));
Debug.Log("z轴向量: " + transform.forward.ToString("F3"));

这三个向量都是标准向量,代表物体的三个坐标轴的方向

代码挂载到飞机节点上
2 旋转机头,指机头指向目标物体

 // 确定脸的朝向 ( 在本例中,Y轴方向即为脸的朝向)
Vector3 face = this.transform.up;

// 方向向量 ( 飞机  小球 )
GameObject target = GameObject.Find("球");
Vector3 direction = target.transform.position - this.transform.position;

// 机头要旋转的角度
float angle = Vector3.SignedAngle(face, direction, Vector3.forward);

// 旋转
this.transform.Rotate(0, 0, angle);

11.5(练习)飞向目标

在这里插入图片描述

private bool upward = true; // 飞行的方向
  void Start()
    {
        // 确定脸的朝向 ( 在本例中,Y轴方向即为脸的朝向)
        Vector3 face = this.transform.up;

        // 方向向量 ( 飞机  小球 )
        GameObject target = GameObject.Find("球");
        Vector3 direction = target.transform.position - this.transform.position;

        // 机头要旋转的角度
        float angle = Vector3.SignedAngle(face, direction, Vector3.forward);

        // 旋转
        this.transform.Rotate(0, 0, angle);
    }

    // Update is called once per frame
    void Update()
    {
        //if (upward && transform.position.y > 5)
        //{
        //    upward = false;
        //    transform.localEulerAngles = new Vector3(0, 0, 180);
        //}
        若到达下边界就换向
        //if (!upward && transform.position.y < -5)
        //{
        //    upward = true;
        //    transform.localEulerAngles = new Vector3(0, 0, 0);
        //}

        float step = 1.6f * Time.deltaTime; // 每帧移动的距离
        transform.Translate(0, step, 0, Space.Self);
    }

12.1屏幕坐标

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如何获取一个物体的屏幕坐标?

Vector3 pos = transform.position;
Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);#获取主摄像机将世界坐标转换成窗口屏幕(运行生成的窗口的屏幕)中的坐标

世界坐标系一屏幕中间点为原点
而屏幕坐标系以窗口屏幕左下角为原点

屏幕坐标是以像素为单位的

示例代码

public class MyJet : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        int screenW = Screen.width;
        int screenH = Screen.height;
        Debug.Log("屏幕: " + screenW + ", " + screenH);

		 // 世界坐标:  Unit
        Vector3 worldPos = transform.position;  

		 // 屏幕坐标:像素
        Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);

		 // 注意:屏幕坐标的单位是像素
        Debug.Log("世界坐标: " + worldPos);
        Debug.Log("屏幕坐标: " + screenPos);

    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

12.2屏幕的边界

在这里插入图片描述

上下界限可确定,但左右需要通过长宽比得到
在这里插入图片描述
在这里插入图片描述

运行后
在这里插入图片描述

public class test12 : MonoBehaviour
{
    private bool toRight = true;//换向标志

    // Start is called before the first frame update
    void Start()
    {
        //当前节点对象绕z轴顺时针旋转90度
        transform.eulerAngles = new Vector3(0, 0, -90);
    }

    // Update is called once per frame
    void Update()
    {
        //将当前对象世界坐标转换成屏幕坐标
        Vector3 sp = Camera.main.WorldToScreenPoint(transform.position);
        if (toRight && sp.x > Screen.width)
        {
            toRight = false;
            transform.eulerAngles = new Vector3(0, 0, 90);
        }
        if (toRight && sp.x < 0)
        {
            toRight = true;
            transform.eulerAngles = new Vector3(0, 0, -90);
        }

        float step = 1.8f * Time.deltaTime;

        //注意机头指向,沿着自己的Y轴指向前进
        transform.Translate(0, step, 0, Space.Self);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2134624.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 常用模块(二):json模块

目录 1. json 模块介绍1.1 json 模块快用导航1.2 什么是JSON1.2.1 JSON的特点1.2.2 JSON的基本语法1.2.3 JSON数据类型1.2.4 JSON示例1.2.5 JSON使用场景1.2.6 JSON的优缺点1.2.7 JSON和XML的比较 1.3 json 模块 2. dump() 方法 --- 转换为 JSON 格式写入文件2.1 语法参考2.2 实…

电巢科技2024中国光博会圆满收官

2024年9月11日-13日&#xff0c;备受瞩目的第二十五届中国国际光电博览会(CIOE中国光博会)在中国深圳国际会展中心圆满闭幕。 电巢科技以其前沿的Ecosmos元宇宙产品体验区&#xff0c;及联袂中国光博会打造的三大特色栏目——《逛展最前线》《光引未来大咖说》以及《智能消费电…

【Linux】查看操作系统开机时初始化的驱动模块列表的一个方法

这个方法是摸索出来的&#xff0c;也不一定对&#xff1a; 1、驱动层module_init(module_init_function)作为模块初始化&#xff0c;并且提供模块内部初始化的函数名&#xff1b; 2、找到所有驱动目录drivers下所有module_init(module_init_function)&#xff0c;在内核6.9.0…

探索 Python 代码重构的魔法:rope 库的神秘力量

文章目录 探索 Python 代码重构的魔法&#xff1a;rope 库的神秘力量背景&#xff1a;为何选择 rope&#xff1f;什么是 rope&#xff1f;如何安装 rope&#xff1f;简单的库函数使用方法场景应用常见问题与解决方案总结 探索 Python 代码重构的魔法&#xff1a;rope 库的神秘力…

影视直冲?对接卡券特权充值接口对于用户来说有什么优势?

对用户来说有哪些优势&#xff1a; 便利性&#xff1a;用户可以直接在应用程序或网站上充值和使用卡券&#xff0c;无需通过多个平台或渠道&#xff0c;提高了用户体验。实时性&#xff1a;卡券充值和使用状态可以实时更新&#xff0c;用户可以立即看到余额变化和卡券状态。安…

建造者模式:灵活构建复杂对象的利器

在软件开发中&#xff0c;创建一个复杂对象通常需要多个步骤和参数&#xff0c;直接在客户端代码中进行这些操作不仅繁琐&#xff0c;而且难以维护。建造者模式&#xff08;Builder Pattern&#xff09;提供了一种优雅的解决方案&#xff0c;使得对象的创建过程更加清晰、灵活和…

以最小成本实现最大销售:《稻盛和夫的实学:经营与会计》中的企业经营哲学

在《经营与会计》中稻盛和夫提出&#xff0c;会计是现代企业经营的中枢&#xff0c;经营者必须掌握企业活动的真实状态&#xff0c;才能带领企业长期持续的发展。 经营企业要以现金为基础&#xff0c;把握赚的钱在哪里&#xff0c;以什么形式存在&#xff0c;根据手上确凿无疑…

技术分享-商城篇-营销模块-优惠券种类(二十六)

前言 在之前的文章技术分享-商城篇-优惠券管理-功能介绍及种类&#xff08;二十四&#xff09; &#xff0c;有对优惠券设计做了阐述&#xff0c;优惠券作为一种强大的促销工具&#xff0c;不仅能够吸引新客户&#xff0c;还能促进现有客户的复购与订单金额的提升。但是优惠券…

HTML+CSS - 网页布局之网格布局

1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为&#xff0c;包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一&#xff0c;在文档中创建类似于网格的效果&…

迷你洗衣机哪个牌子好又实惠?5大主流产品综合实测分享!

在日常生活中&#xff0c;内衣洗衣机已成为现代家庭必备的重要家电之一。选择一款耐用、质量优秀的内衣洗衣机&#xff0c;不仅可以减少洗衣负担&#xff0c;还能提供高效的洗涤效果。然而&#xff0c;市场上众多内衣洗衣机品牌琳琅满目&#xff0c;让我们往往难以选择。那么&a…

有性价比高的无线蓝牙耳机吗?四款适合学生党的开放式耳机推荐

最近也是大学生高中生都开学了&#xff0c;我想很多学生都想寻找一款性价比高的真无线蓝牙耳机来提升学习和休闲时的音频体验吧。但是市场上的蓝牙耳机品牌和型号繁多&#xff0c;所以并非所有都适合学生群体的预算和需求。只能是由比较专业的耳机测评专家来推荐给学生党入手了…

git编译安装报错

编译安装步骤 卸载旧的 yum -y remove gitcd /usr/local/src/wget https://www.kernel.org/pub/software/scm/git/git-2.15.1.tar.xztar -vxf git-2.15.1.tar.xzcd git-2.15.1make prefix/usr/local/git allmake prefix/usr/local/git installecho "export PATH$PATH:/usr…

C++教程(一):超详细的C++矩阵操作和运算(附实例代码,与python对比)

python教程&#xff08;一&#xff09;&#xff1a;超详细的numpy矩阵操作和运算&#xff08;附实例代码&#xff09; 在之前的章节中&#xff0c;我们详细介绍了python中numpy的矩阵操作。但在自动驾驶开发中&#xff0c;我们一般采用C进行功能开发&#xff0c;因此C矩阵运算…

8月最新大模型新书-《自然语言处理:大模型理论与实践》(附PDF)西财赵宇教授新作

介绍 本书主要面向高校本科生、研究生及教学科研人员&#xff0c;适合作为教学用书。同时&#xff0c;它也适合计算语言学家、语言学家、数据科学家和NLP开发人员等专业人士使用。为了照顾不同读者的学科背景差异&#xff0c;书中附录部分专门介绍了与NLP密切相关的基础知识&a…

HAL库学习梳理——SPI(收发Flash数据实验)

实验现象&#xff1a;将LED灯的状态保存到Flash里&#xff0c;掉电读取Flash并设置LED。 1&#xff0c;STM32CubeMx 配置 1.1 SPI引脚说明 外设连接 1.2 参数配置 配置工作模式 主机工作模式 SPI 工作参数设置 1.3 GPIO配置 SPI接线配置 SPI引脚的GPIO配置 2&#xff0c;程序…

大模型开源:ChatGLM-6B (介绍以及本地部署)

简介 ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型&#xff0c;基于 General Language Model (GLM) 架构&#xff0c;具有 62 亿参数。结合模型量化技术&#xff0c;用户可以在消费级的显卡上进行本地部署&#xff08;INT4 量化级别下最低只需 6GB 显存&#xff…

水位雨量自动监测站的工作原理

水位雨量自动监测站是一种集自动化、智能化于一体的水文监测设施&#xff0c;主要用于实时监测和记录水位及降雨量的变化&#xff0c;为水文预报、水资源管理、防洪减灾等提供科学依据。水位雨量自动监测站主要由数据采集单元、数据传输网络、数据处理中心及用户终端四大部分构…

js读取文件,生成随机题目,多项选择题则提供随机答案供选择

一.第一个要求 根据模板生成随机题目可以将 --- 内的内容 ---变成JSON然后根据参数的限制条件来生成随机参数&#xff0c;再替换到题目中example.md --- Type: Quiz Template Domain: - Geometry Knowledge:- - 數學- 度量、圖形與空間範疇- 弧長和扇形面積- 理解圓的弧長公…

掌握项目全流程:10个项目管理烫知识

一、启动阶段 1、一个清晰且有吸引力的项目愿景对于项目的成功启动至关重要。它能够让所有项目成员以及相关干系人明白项目的最终目标和意义。 在这个阶段&#xff0c;我们可以利用项目管理工具进度猫来可视化地呈现项目的整体愿景&#xff0c;将大的目标拆分成初步的任务板…

RT-DETR训练自己的数据集(从代码下载到实例测试)

文章目录 前言一、RT-DETR简介二、环境搭建三、构建数据集四、修改配置文件①数据集文件配置②模型文件配置③训练文件配置 五、模型训练和测试模型训练模型测试 总结 前言 提示&#xff1a;本文是RT-DETR训练自己数据集的记录教程&#xff0c;需要大家在本地已配置好CUDA,cuD…