unity3d入门教程四

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 updatevoid Start(){}// Update is called once per framevoid 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 framevoid 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 updatevoid Start(){int screenW = Screen.width;int screenH = Screen.height;Debug.Log("屏幕: " + screenW + ", " + screenH);// 世界坐标:  UnitVector3 worldPos = transform.position;  // 屏幕坐标:像素Vector3 screenPos = Camera.main.WorldToScreenPoint(worldPos);// 注意:屏幕坐标的单位是像素Debug.Log("世界坐标: " + worldPos);Debug.Log("屏幕坐标: " + screenPos);}// Update is called once per framevoid Update(){}
}

12.2屏幕的边界

在这里插入图片描述

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

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

public class test12 : MonoBehaviour
{private bool toRight = true;//换向标志// Start is called before the first frame updatevoid Start(){//当前节点对象绕z轴顺时针旋转90度transform.eulerAngles = new Vector3(0, 0, -90);}// Update is called once per framevoid 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.rhkb.cn/news/423107.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-线性表顺序单项链表双向链表循环链表

1数据结构概述 数据结构是计算机组织、存储数据的方式。是思想层面的东西&#xff0c;和具体的计算机编程语言没有关系。可以用任何计算机编程语言去实现这些思想。 1.1 数据逻辑结构 反映数据逻辑之间的逻辑关系&#xff0c;这些逻辑关系和他们咱在计算机中的存储位置无关。…

apache文件共享和访问控制

实现apache文件共享 文件共享路径 <Directory "/var/www/html"> #默认发布路径&#xff0c;功能限制 Options Indexes FollowSymLinks #indexes支持文件共享功能 AllowOverride None Require all granted </Directory> 进入到该路径下 cd…

为什么sqlynx是连接国产数据库的最佳选择?

1. 广泛的国产数据库支持 SQLynx除了国际上的主流数据库外&#xff0c;还支持多种国产数据库&#xff0c;如达梦、人大金仓、OceanBase、openGauss等。随着国产数据库市场的不断发展和成熟&#xff0c;越来越多的企业和机构开始选择国产数据库来满足其数据管理需求。SQLynx通过…

WebGL系列教程三(使用缓冲区绘制三角形)

目录 1 前言2 缓冲区介绍3 声明顶点的位置和颜色4 回忆Shader的初始化5 开始缓冲区的逻辑5.1 声明顶点坐标5.2 创建并绑定缓冲区5.3 获取顶点着色器中的变量5.4 使变量从缓冲区取值5.5 绘制5.6 完整代码 6 总结 1 前言 上一篇中我们介绍了WebGL的环境搭建及Shader的初始化&…

webpack - 五大核心概念和基本配置(打包一个简单HTML页面)

// 五大核心概念 1. entry&#xff08;入口&#xff09; 指示Webpack从哪个文件开始打包2. output&#xff08;输出&#xff09; 指示Webpack打包完的文件输出到哪里去&#xff0c;如何命名等3. loader&#xff08;加载器&#xff09; webpack本身只能处理js&#xff0c;json等…

51单片机快速入门之定时器和计数器

51单片机快速入门之定时器 断开外部输入 晶振振荡 假设为 12MHz 12分频之后,为1MHz 当其从0-65536 时,需要65536μs 微秒 也就是65.536ms 毫秒 溢出(值>65536 时)>中断>执行中断操作 假设需要1ms后产生溢出,则需要设置初始值为64536 此时定时器会从 64536 开始计…

xss-labs-master通关教程

一.level1 先来进行一下代码审计 <?php ini_set("display_errors", 0);//关闭错误显示 $str $_GET["name"]; //接受URL来的get形式的name传参 echo "<h2 aligncenter>欢迎用户".$str."</h2>";//在网页输出&#x…

引领AI PC浪潮,Arm人工智能创新应用大赛火热报名中

AI PC&#xff0c;即搭载人工智能技术的个人电脑&#xff0c;正成为个人电脑市场的新宠儿。而正在如火如荼进行中的 Arm人工智能创新应用大赛&#xff0c;则为敏锐的开发者探索 AI PC 应用开发掘金之路提供了平台。 点击报名 挑战10万奖金池 AI PC 增长强劲&#xff0c;年出货…

【Hadoop|HDFS篇】HDFS的读写流程

1. HDFS的写流程 1.1 剖析文件的写入 副本存储节点的选择问题&#xff1a; 第一个副本在Client所在的节点上&#xff0c;如果客户端在集群外&#xff0c;随机选一个。第二个副本在另一个机架的随机一个节点上。第三个副本在第二个副本所在的机架的随机节点上。 2. HDFS的写流…

2024CCPC网络预选赛

vp链接&#xff1a;Dashboard - The 2024 CCPC Online Contest - Codeforces B. 军训 II 序列 a 从小到大排列或者从大到小排列时&#xff0c;不整齐度是最小的。方案数是所有相同数字的个数的排列数的乘积。如果首尾的数字不同的话&#xff0c;还要再乘个 2。 #include <…

Social Network Influence Maximization Based on Graph Attention Mechanisms

摘要 社交网络中的关键节点对整个网络具有重要的影响力&#xff0c;而社交网络中的一些节点可能位于网络的中心&#xff0c;而另一些节点则可能位于网络的边缘&#xff0c;传统的影响力最大化算法忽略了这种不平衡。通过忽略位于网络边缘但连接到中心的节点来导致信息的传播。为…

Java项目: 基于SpringBoot+mybatis+maven医院管理系统(含源码+数据库+任务书+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven医院管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、…

【LeetCode】每日一题 2024_9_13 预算内的最多机器人数目(滑动窗口、单调队列)

LeetCode 启动&#xff01; 每日一题的题解重新开始连载&#xff01; 题目&#xff1a;预算内的最多机器人数目 题目链接&#xff1a;2398. 预算内的最多机器人数目 题目描述 代码与解题思路 func maximumRobots(chargeTimes []int, runningCosts []int, budget int64) (an…

期权组合策略有什么风险?期权组合策略是什么?

今天期权懂带你了解期权组合策略有什么风险&#xff1f;期权组合策略是什么&#xff1f;期权组合策略是通过结合不同期权合约&#xff08;如看涨期权和看跌期权&#xff09;&#xff0c;以及标的资产&#xff08;如股票&#xff09;来实现特定投资目标的策略。 期权组合策略市…

改进大语言模型的最全方法!

这是一篇关于适应开源大语言模型&#xff08;LLMs&#xff09;的三部系列博客的第一篇。本文探讨将LLM适应领域数据的各种方法。 第二部分讨论如何确定微调&#xff08;fine-tuning&#xff09;是否适合您的用例。第三部分探讨策划良好训练数据集的一些经验法则。 0 引言 大…

【IP协议】IP协议报头结构(上)

IP 协议报头结构 4位版本 实际上只有两个取值 4 > IPv4&#xff08;主流&#xff09;6 > IPv6 IPv2&#xff0c;IPv5 在实际中是没有的&#xff0c;可能是理论上/实验室中存在 4位首部长度 IP 协议报头也是变长的&#xff0c;因为选项个数不确定&#xff0c;所以报头长…

突破瓶颈:Java并发编程的最佳实践与技巧,你了解了吗?

文章目录 1 什么是 Executor 和 ExecutorService &#xff1f;这两个接口有什么区别&#xff1f;2 java.util.concurrent 标准库中 ExecutorService 的可用实现是什么 &#xff1f;3 什么是 Java 内存模型&#xff08; JMM &#xff09;&#xff1f;描述下其目的和基本思想4 JM…

Spring扩展点系列-ApplicationContextAwareProcessor

文章目录 简介源码分析示例代码示例一&#xff1a;扩展点的执行顺序运行示例一 示例二&#xff1a;获取配置文件值配置文件application.properties内容定义工具类ConfigUtilcontroller测试调用运行示例二 示例三&#xff1a;实现ResourceLoaderAware读取文件ExtendResourceLoad…

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染&#xff1a;一项综述 文章目录 大规模语言模型的基准数据污染&#xff1a;一项综述摘要1 引言 摘要 大规模语言模型&#xff08;LLMs&…

css——网格布局

名词解释 div{$}*9tab键&#xff0c;快捷生成 记首字母gtc 网格布局&#xff1a;display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 100px; &#xff08;父元素&#xff09; <!DOCTYPE html> <html lang&q…