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);}
}
相关文章:
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 类型…...
无人机飞控的原理!!!
一、传感器系统 陀螺仪:用于检测无人机的角速度和角度,帮助确定无人机的姿态。 加速度计:用于检测无人机的加速度和倾斜角度,进一步辅助姿态判断。 磁力计(或罗盘):用于检测无人机的方向&…...
深入解析代理模式:静态代理、JDK 动态代理和 CGLIB 的全方位对比!
代理模式(Proxy Pattern)是一种结构型设计模式,它提供了对象的替身,即代理对象来控制对实际对象的访问。通过代理对象,可以在不修改目标对象的情况下,扩展或控制其功能。例如,代理模式可以用于延…...
51单片机快速入门之独立按键
51单片机快速入门之独立按键 这里我们需要用上一个仿真软件,只因不想硬件焊接:PROTEUS DESIGN SUITE PROTEUS DESIGN SUITE: PROTEUS DESIGN SUITE是一款由LabCenter Electronics开发的电子设计自动化(EDA)软件,广泛应用于电气工程和电子工…...
设计模式之工厂模式(通俗易懂--代码辅助理解【Java版】)
文章目录 设计模式概述1、工厂模式概述1)特点:2)主要角色:3)工作流程:4)优点5)缺点6)适用场景 2、简单工厂模式(静态工厂模式)1) 在简单工厂模式中,有三个主要…...
速盾:高防 cdn 分布式防御攻击?
在当今数字化时代,网络安全问题日益凸显,各种网络攻击手段层出不穷。为了保护企业和个人的网络资产安全,高防 CDN(Content Delivery Network,内容分发网络)成为了一种重要的防御手段。其中,分布…...
Unity3D类似于桌面精灵的功能实现
前言: 由于最近在做游戏魔改,很多功能在游戏里面没法实现(没错,说的就是排行榜),所以准备用Unity3D开发一个类似于桌面精灵的功能部件,实现效果如下: PS:有需要定制的老…...
Audio Over IP的PTP时钟初探
Audio Over IP的PTP时钟初探 这几天参加省局举办的技术能手比赛,第一次接触并了解AOIP(Audio Over IP)相关的理论和实践相关的知识。其中AoIP的时钟同步采用的是IEEE 1588 标准的PTP(Precision Time Protocol)基于网络…...
【加密社】深入理解TON智能合约 (FunC语法)
king: 摘要:在TON(TheOpenNetwork)区块链平台中,智能合约扮演着举足轻重的角色。本文将通过分析一段TON智能合约代码 带领读者学习dict(字典)和list(列表)在FunC语言中的用法&#x…...
笔试强训day11
游游的水果大礼包 #include <iostream> #define int long longusing namespace std; int n, m, a, b;signed main() {cin>>n>>m>>a>>b;int ret 0;for(int x 0; x < min(n / 2, m); x) // 枚举 1 号礼包的个数{int y min(n - x * 2, (m - …...
移动应用开发与测试赛题
引言 在现代车载系统开发中,UI设计和编程实现同样重要。本文将分别探讨车载系统的UI设计任务和相关的编程任务,帮助开发者全面了解车载系统开发的各个方面。 第一部分:UI设计任务 任务1:绘制"左转向视频显示"模块界面…...
Qt常用控件——QLineEdit
文章目录 QLineEdit核心属性和信号基本示例正则表达式约束验证输入密码是否一致密码显示状态切换 QLineEdit核心属性和信号 QLineEdit用来表示单行输入,可以输入一段文本,但是不能替换 核心属性: 属性说明text输入框中的文本inputMask输入…...
(postman)接口测试进阶实战
1.内置和自定义的动态参数 内置的动态参数有哪些? ---{{$}}--是内置动态参数的标志 //自定义的动态参数 此处date.now()的作用就相当于上面的timestamp 2.业务闭环及文件接口测试 返回的url地址可以在网页中查询得到。 3. 常规断言,动态参数断言…...
R语言统计分析——功效分析(比例、卡方检验)
参考资料:R语言实战【第2版】 1、比例检验 当比较两个比例时,可使用pwr.2p.test()函数进行功效分析。格式为: pwr.2p.test(h, n, sig.level, power, alternative) 其中,h是效应值,n是各相同的样本量。效应值h的定义如…...
Leetcode 每日一题:Longest Increasing Path in a Matrix
写在前面: 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想,绝对和 DFS 相关,但是题目的优化要求非常高,对于语言和内存特性的考察特别丰富,如果是…...
ARCGIS PRO DSK MapTool
MapTool用于自定义地图操作工具,使用户能够在ArcGIS Pro中执行特定的地图交互操作。添加 打开MapTool1.vb文件,可以看到系统已经放出MapTool1类: Public Sub New()将 IsSketchTool 设置为 true 以使此属性生效IsSketchTool TrueSketchTyp…...
国网B接口 USC安防平台 海康摄像机配置
国网B接口海康摄像机配置介绍 如下以海康DS-NACN6432I-GLN摄像机为例,配置国网B接口设备接入流程,海康摄像机的固件版本为 V5.6.11 build 210109 210107。该设备为球机,支持国网B接口云台控制功能。图标编号可以对应二者的配置。 注意 同一…...
Win10安装.net FrameWork3.5失败解决方法
win10安装.net FrameWork3.5失败解决方法 已经好久没有来投稿了,实在最近业务缠身,忙的焦头烂额(呵~多么伟大的牛马) 但最近开发使用windows11实在是拉胯的不行,升级完就后悔,所以就一怒之下,重装了win10 可是,好家伙,我重装完遇到一个问题,就是在使用.Net Framework3.5,按照Mi…...
【pipenv】—— 虚拟环境管理工具近乎全面的总结
安装 pip install pipenv 使用和配置 设置虚拟环境文件创建在项目根目录 添加环境变量:WORKON_HOMEPIPENV_VENV_IN_PROJECT 创建虚拟环境时,自动换用指定的pip源 添加环境变量:PIPENV_TEST_INDEXhttps://pypi.tuna.tsinghua.edu…...
windows C++-并行编程-并行算法(五) -选择排序算法
并行模式库 (PPL) 提供了对数据集合并行地执行工作的算法。这些算法类似于 C 标准库提供的算法。并行算法由并发运行时中的现有功能组成。 在许多情况下,parallel_sort 会提供速度和内存性能的最佳平衡。 但是,当您增加数据集的大小、可用处理器的数量或…...
3步彻底清理Windows右键菜单:ContextMenuManager高效管理指南
3步彻底清理Windows右键菜单:ContextMenuManager高效管理指南 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 你是否曾因Windows右键菜单中堆积如山的…...
从机房搬服务器到写代码上云:一个传统运维的十年转型路,我如何成了SRE?
从物理机到云原生:一位技术人的十年转型实战笔记 运维行业的变革速度远超许多人想象。十年前,我还在机房亲手插拔网线、用KVM切换器调试服务器;如今,我的日常工作已经变成了编写自动化部署脚本和设计分布式系统监控方案。这不是简…...
SecureCRT 9.1.0不止是安装:揭秘高级功能如会话日志、脚本自动化与安全配置最佳实践
SecureCRT 9.1.0高阶实战:从会话审计到自动化运维的全栈指南 SecureCRT早已超越基础终端工具的范畴,成为运维工程师手中的瑞士军刀。当大多数教程还在反复讲解安装步骤时,真正的高阶用户已经在用会话日志构建操作审计体系,通过脚本…...
Cream开发者进阶指南:深入理解架构搜索算法
Cream开发者进阶指南:深入理解架构搜索算法 【免费下载链接】Cream This is a collection of our NAS and Vision Transformer work. 项目地址: https://gitcode.com/gh_mirrors/cr/Cream 在深度学习模型设计领域,神经架构搜索(NAS&am…...
从零构建私有数字保险库:硬件选型、加密策略与实战部署
1. 项目概述:从“0”开始的数字资产保险库在数字资产日益成为个人与企业核心财富的今天,如何安全、自主地保管这些资产,成为了一个绕不开的难题。无论是加密货币的私钥、重要的数字凭证、敏感的商业文档,还是家庭成员的密码本&…...
SoC与SoM:硬件开发的效率革命与双刃剑效应
1. 项目概述:当“系统”成为商品从业十几年,从画第一块51单片机的板子,到参与设计复杂的通信基站,我亲眼见证了硬件开发模式的剧变。如果说早些年我们还在为如何把CPU、内存、Flash、各种接口控制器塞进一块PCB而绞尽脑汁…...
星际探险队
目录 星际探险队 游戏目标 游戏准备 核心玩法 沟通技能 星际探险队 2-5人的合作桌游 游戏目标 合作完成任务卡目标,如赢得特定牌墩、特定卡牌或特定数量牌墩 游戏准备 牌组:共 40 张牌,含 4 种颜色(1-9)和王…...
用Arduino Nano和MAX7219模块,5分钟搞定一个8x8 LED点阵显示(附完整代码)
用Arduino Nano和MAX7219模块快速打造8x8 LED点阵显示系统 周末整理零件箱时翻出一片落灰的MAX7219模块和Arduino Nano,突然想起可以给工作室做个实时温度显示器。这个组合堪称电子爱好者的"乐高积木"——不需要复杂的电路设计,短短几行代码就…...
ENVI 5.6 + COSI-Corr插件整合指南:搞定地表形变分析的第一步
ENVI 5.6 COSI-Corr插件整合指南:搞定地表形变分析的第一步 对于地质测绘领域的研究人员和工程师来说,地表形变监测是理解地质灾害、评估基础设施安全的重要技术手段。在众多遥感分析方法中,COSI-Corr(Co-registration of Optic…...
保姆级教程:在NVIDIA TX1上搞定万集WLR-716激光雷达的ROS驱动与RVIZ可视化
保姆级教程:在NVIDIA TX1上搞定万集WLR-716激光雷达的ROS驱动与RVIZ可视化 当机器人开发者第一次拿到万集WLR-716激光雷达和NVIDIA Jetson TX1开发板时,最迫切的需求就是快速搭建测试环境,验证硬件功能。本文将提供一份从零开始的详细指南&am…...
