Unity学习日志

目录

获取相机可视范围的世界坐标(2D)

视口转世界坐标和屏幕转世界坐标的区别:

屏幕转世界坐标

视口转屏幕坐标

视口转屏幕结合3D数学实现可视范围的怪物生成

transform.up游戏对象的方向问题

其实还有一种不用Translate的写法:

修改 transform.up 的行为和影响

C#抽象类和接口的区别

获取相机可视范围的世界坐标(2D)

// 获取摄像机到z=0平面的距离
float zDistance = Mathf.Abs(Camera.main.transform.position.z); 

Vector3 bottomLeft = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, zDistance));
Vector3 topRight = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, zDistance));

// 计算转换后的中心点和大小等
Vector2 center = (topRight + bottomLeft) / 2;
Vector2 size = new Vector2(topRight.x - bottomLeft.x, topRight.y - bottomLeft.y);

视口转世界坐标和屏幕转世界坐标的区别:

屏幕转世界坐标

屏幕坐标系统是以像素为单位,原点(0,0)通常位于屏幕的左上角,x轴向右增加,y轴向下增加。屏幕坐标表示的是屏幕上每一个像素的位置。

在Unity中,可以使用Camera.ScreenToWorldPoint()方法将屏幕坐标转换成世界坐标。这通常用于鼠标点击或触摸屏事件,因为这些输入事件提供的坐标基于屏幕像素。

比如说将鼠标在屏幕上点击的位置转化为世界坐标:

Vector3 screenPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, distanceFromCamera);//这个距离是根据自己想要检测的目标所在的平面而决定的
Vector3 worldPosition = Camera.main.ScreenToWorldPoint(screenPosition);

视口转屏幕坐标

视口坐标系统用的是一种从0到1的范围,其中(0,0)表示视口的左下角,(1,1)表示右上角。视口坐标与屏幕的实际分辨率无关,因此更加灵活和通用。

在Unity中,Camera.ViewportToWorldPoint()方法被用来将视口坐标转换为世界坐标。这对于定位相对于摄像机视图百分比位置的对象非常有用。

应用:将可视范围转化为世界坐标,得到在世界坐标中的可视范围,可用于参与一些检测啥的

视口转屏幕结合3D数学实现可视范围的怪物生成

 private void CalculateCurrentProducePosition()
 {
// 获取摄像机到z=0平面的距离
     float zDistance = Mathf.Abs(Camera.main.transform.position.z); 

     bottomLeft = Camera.main.ViewportToWorldPoint(new Vector3(0, 0, zDistance));
      topRight = Camera.main.ViewportToWorldPoint(new Vector3(1, 1, zDistance));

     // 计算中心点和大小等
      center = (topRight + bottomLeft) / 2;
      size = new Vector2(topRight.x - bottomLeft.x, topRight.y - bottomLeft.y);
 }

 private void GenerateEnemy()
 {
     
     float radiu =size.x/2.0f;
         float angle = Random.Range(0, 359);
//一定要加上中心点啊,3D数学!
        Vector3 generateDir = Quaternion.Euler(0, 0, angle) * new Vector3(0,1f,0) * radiu + new Vector3(center.x, center.y, 0);  //圆上的一个随机点

         GamePoolManager.Instance.TryGetPoolItem("OrdinaryZombies", generateDir, Quaternion.identity);
     
 }

transform.up游戏对象的方向问题

修改 transform.up 是一个改变游戏对象朝向的有效方式,它通过调整对象的旋转来确保其“上”方向与你指定的向量对齐

这个用于比方说子弹的弹头旋转啥的就非常合适,并且效果出奇

在Update中:

transform.up = (target.transform.position - transform.position); //旋转方向朝向指向敌人的向量的方向,(同时也夹杂着这个方向的旋转)

transform.Translate(transform.up * moveSpeed * Time.deltaTime, Space.World);

Space.World是重点,为什么呢,参考下图

不填Space.World,就默认Space.Self,朝向就会变得非常的奇怪

其实还有一种不用Translate的写法:

transform.up = (target.transform.position-transform.position);

transform.position = transform.position+transform.upTime.deltaTimemoveSpeed;

这种写法其实更加不容易出错

关于transform.up的知识点:

修改 transform.up 的行为和影响

  1. 修改旋转:设置 transform.up 会自动调整游戏对象的旋转,以使其上方向与你指定的向量对齐。这一修改涉及到四元数的计算,Unity内部会自动处理这些计算。

  2. 内部实现:在Unity的内部实现中,当你设置 transform.up 时,实际上是在调用 Quaternion.LookRotation 方法。这个方法将新的向上向量和前向向量(如果未明确指定,则使用当前前向向量)作为参数,计算出新的旋转。

  3. 向量归一化:当你设置 transform.up 时,Unity会自动归一化你提供的向量。归一化是将向量的长度标准化为1的过程,这对于方向向量是必要的,因为方向向量的长度不应影响对象的旋转

对比Vector3.up:(Unity手册中关于transform.up的解释)

世界空间中变换的绿轴。

操作游戏对象在世界空间中变换的 Y 轴(绿轴)上的位置。与 Vector3.up 不同,Transform.up 在移动游戏对象的同时,还考虑其旋转。

旋转游戏对象时,表示游戏对象的 Y 轴的绿色箭头也会改变方向。Transform.up 沿绿色箭头所在的轴 (Y) 移动游戏对象。

要在沿 Y 轴移动 GameObject 时忽略旋转,请参阅 Vector3.up。

C#抽象类和接口的区别

接口是 用于规范不同对象的共同行为

而当一个基类变成抽象类的时候,子类去继承,那他们的父类就都是同一个类型了,所以本质上的区别就体现在了这里

也就是说当我们不知道这些子类是否要继承不同的基类的时候,我们通常就可以使用接口来进行规范

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROM的简单实现

描述 实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。 接口信号图如下: 使用Veri…

MIPS汇编语言详解

MIPS(Microprocessor without Interlocked Pipeline Stages)是一种精简指令集计算机(RISC)架构,由MIPS计算机系统(现在是MIPS Technologies)开发。它以其简单性和效率而闻名,特别适用…

【数据结构】排序算法大全(快速、堆、归并、插入、折半、希尔、冒泡、计数、基数)各算法比较、解析+完整代码

文章目录 八、排序1.插入排序1.1 直接插入排序1.2 折半插入排序1.3 希尔排序 2.交换排序2.1 冒泡排序2.2 快速排序 3.选择排序3.1 简单选择排序3.2 堆3.2.1 堆排序3.2.2 堆插入删除*完善代码 堆 4.归并、基数、计数排序4.1 归并排序4.2 基数排序4.3 计数排序 5.内部排序算法的比…

PCL 二维凸包切片法计算树冠体积

目录 一、算法原理1、原理概述2、参考文献二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 1、原理概述 二维凸包法是先将树冠等间隔分层切片,如图(e)采用二维凸包算法对每层…

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力?

中国改革报是什么级别的报刊?在哪些领域具有较高的影响力? 《中国改革报》是国家发展和改革委员会主管的全国性综合类报纸。它在经济领域和改革发展方面具有重要的影响力,是传递国家政策、反映改革动态的重要平台。该报对于推动中国的经济改…

实验室课程|基于SprinBoot+vue的实验室课程管理系统(源码+数据库+文档)

实验室课程管理系统 目录 基于SprinBootvue的实验室课程管理系统 一、前言 二、系统设计 三、系统功能设计 1管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取: 博主介…

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型

PyTorch深度学习实战(44)——基于 DETR 的目标检测模型 0. 前言1. Transformer1.1 Transformer 基础1.2 Transformer 架构 2. DETR2.1 DETR 架构2.2 实现 DETR 模型 3. 基于 DETR 实现目标检测3.1 数据加载与模型构建3.2 模型训练与测试 小结系列链接 0.…

WindowsCMD窗口配置OhMyPosh

WindowsCMD窗口配置OhMyPosh 文章目录 WindowsCMD窗口配置OhMyPosh1. 按装Clink1. 安装Oh-My-Posh2. 安装Clink2. 安装后的位置 2. 编写Lua脚本1. oh-my-posh Lua脚本2. 重启cmd窗口看效果 OhMyPosh对Windows CMD 没有现成的支持。 然而可以使用Clink来做到这一点,它…

深度学习——自己的训练集——训练模型(CNN)

训练模型 1.导入必要的库2.加载类别名称3.创建标签映射字典4.加载图像数据和对应的标签5.构建和编译CNN模型6.训练模型7.保存训练好的模型 1.导入必要的库 导入处理数据和训练模型时需要的库 os: 这个模块提供了与操作系统交互的功能,比如文件和目录操作。 cv2: 这…

2024-5-10-从0到1手写配置中心Config之Spring Value热更新

定义SpringValueProcessor处理类 实现BeanPostProcessor后置处理器接口,扫描所有的Spring value,保存起来。实现ApplicationListener接口,在配置变更时,更新所有的spring value 实现BeanPostProcessor后置处理器接口 实现postPr…

移动云:连接未来的智慧之旅

随着数字化转型的加速,云服务在各行各业中的应用越来越广泛。移动云不仅提供了灵活的计算和存储资源,还通过创新的技术手段,为企业和开发者解决了许多实际问题。在这个变革的大背景下,移动云服务作为中国移动倾力打造的云业务品牌…

155. 最小栈

题目: 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶…

深入解析内置模块OS:让你的Python代码更懂操作系统

新书上架~👇全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一、OS模块简介与基础应用 二、文件与目录操作详解 三、OS模块的高级应用:双色…

【算法】前缀和——除自身以外数组的乘积

本节博客是用前缀和算法求解“除自身以外数组的乘积”,有需要借鉴即可。 目录 1.题目2.前缀和算法3.变量求解4.总结 1.题目 题目链接:LINK 2.前缀和算法 1.创建两个数组 第一个数组第i位置表示原数组[0,i-1]之积第二个数组第i位置表示原数组[i1,n-1]…

How to limit request by IP on nginx?

/etc/nginx/conf.d/default.conf 1.Define a limit_req_zone # 定義限流區塊 limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; limit_req_zone $binary_remote_addr zonelimit_zone:10m rate2r/s; 是一个 Nginx 配置指令,用于定义请求限制区域和…

【linux】多线程(2)

文章目录 线程的应用生产消费者模型自制锁生产消费队列成员参数生产函数消费函数 任务处理方式主函数 POSIX信号量sem_wait()sem_post() 线程池应用场景示例 单例模式饿汉实现单例 吃完饭, 立刻洗碗, 这种就是饿汉方式. 因为下一顿吃的时候可以立刻拿着碗就能吃饭.懒汉实现单例…

GMSL2硬件设计V1.1

一、说明 GMSL(Gigabit Multimedia Serial Links),中文名称为千兆多媒体串行链路,是Maxim公司(现属于ADI)推出的一种高速串行接口,通过同轴电缆或屏蔽双绞线(STP)传输高速串行数据,用于汽车摄像头和显示器应用。GMSL2就是指ADI专有的第二代千兆多媒体串行链路技术,传输…

重生之while在鸣潮学习HTML

个人主页:终端 今天是开荒的第五天,数据坞都刷了吗,没刷就过来学html! 目录 JavaWeb学习路线 1.HTML入门 1.1什么是HTML 1.2HTML&CSS&JavaScript的作用 1.3什么是超文本 1.4什么是标记语言 1.5HTML基础结构 1.6HTML的…

通过acme.sh和cloudflare实现免费ssl证书自动签发

参考使用acme.sh通过cloudflare自动签发免费ssl证书 | LogDicthttps://www.logdict.com/archives/acme.shshi-yong-cloudflarezi-dong-qian-fa-mian-fei-sslzheng-shu

Jmeter-使用手册(_5.5版本)

JMeter是一个Java桌面应用程序,具有使用Swing图形API的图形界面。可以进行接口、性能等测试,也可以对任何数据库进行同样的测试,具有可移植性,可跨平台支持Windows,Linux,Mac上使用。 JMeter运行场景不仅可…