在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结

8 篇文章 2 订阅
订阅专栏
3 篇文章 0 订阅
订阅专栏

被疫情困在家无聊翻翻以前的文章,发现好黑历史啊,虽然是刚学unity的时候写的,后面学习了DX11并且补了3D数学,发现这些问题都是小case了O(∩_∩)O。


在我最近制作的小游戏中,需要实现防御塔面向小兵的功能。(即物体A需要面向物体B)
在这里插入图片描述
这很容易让人想到Unity中自带的LookAt()函数,可惜Unity自带的LookAt()函数是3D的,如果把他用在2D游戏上,一样会让物体绕X轴和Y轴旋转,这不是我们想要的效果。
既然不能用LookAt()函数,比较朴素或者说比较常用的算法(至少我是这样想到的)就是,既然我们拥有了物体A和物体B的位置,那我们肯定就能算出它们的X轴差长度和Y轴差长度,之后把他抽象成直角三角形,利用反三角函数得出我们需要绕Z轴旋转的角度(在2D中Z轴我们只能看到一个点)
在这里插入图片描述
当时可能是下意识的觉得这方法有一丁点麻烦,也可能觉得为啥unity没有自带LookAt2D()这样的函数,反正就是去搜了一下看下别人或官方有没有更简洁的实现方法。
然后便看到了Unity官方社区中的这个问题 https://answers.unity.com/questions/585035/lookat-2d-equivalent-.html
讨论的质量还是比较高的,其中也有跟我一样思路的人。
其中让我比较在意也是发这篇文章原因的的代码是目前点赞最多(但不是题主指定最佳答案)的回答

transform.right = target.position - transform.position;


其中transform.right是物体自身的红色轴向(X轴)在世界坐标中所指向的位置

第一眼看上去其实还是有一点小小的不理解的,当时就在想,我知道让transform.right(看贴图,一些是需要调整transofrm.up,原贴链接也有说,这里统一写transofrm.right)指向目标位置就能实现朝向效果了,可问题是为什么两个位置差就能调整transform.right呢?难道在给transform.right赋值时它里面也进行了反三角函数运算吗?(其实这样理解也行啊是吧=_=)
然后我查了一下,看到了有人这样写

 // Direction vector towards other object (relative to this transform):
 var directionTo = (other.transform.position - transform.position).normalized;
 
 // align forward axis to direction:
 transform.forward = directionTo;

看到了这个normalized(归一化),才拍脑门想起来这个数学知识点。原来我陷入了思维泥潭,我在做反三角函数时把两个顶点位置相减,是为了得到他们两个的长度差来进行反三角函数运算。但是这里的两个顶点相减是为了获得一个指向对方的向量,再做归一化运算确定方向,原代码为了简洁省去了normalized导致一时没看出来,赋值给transform.right时系统是会做的。

这里给数学基础比较薄弱的人再简介一下向量和向量归一化吧,顺便也当自己的一个小总结。

在这里插入图片描述
这里假设有3个顶点A(1,1),B(2,2),C(3,3),顶点B减顶点A获得了一个由A指向B的向量 A B ⃗ \vec {AB} AB ,顶点C减顶点A获得了一个由A指向C的向量 A C ⃗ \vec {AC} AC 。这个时候我们可以观察到向量 A B ⃗ \vec {AB} AB 与向量 A C ⃗ \vec {AC} AC 的方向其实是一致的,那我们怎么判断向量的方向是否一致(或者说获得它的方向)呢?答案是使用向量归一化来判断,也就是转为单位向量。
我们都知道向量的模(长度)是 x 2 + y 2 + z 2 \sqrt{x^2+y^2+z^2} x2+y2+z2 (平面向量z==0),而向量归一化就是把向量转换为单位向量,也就是模为1.即找到满足 x 2 + y 2 + z 2 = 1 x^2+y^2+z^2=1 x2+y2+z2=1,并且x:y:z的值始终不变(比例不变)的这个方程的解。
在unity中transform.right、transform.up、transoform.right等都是单位向量(所以在赋值时也会自动归一化)

Unity使用LookAt的坑
L的博客
11-07 1万+
实现一个物体朝向一个点时,通常使用transform.LookAt。对于3D物体没有问题,但是对于2D物体,会出现奇怪的效果,这样因为API的原理,它的官方解释是这样的:旋转自身,使得当前对象的正Z轴指向目标对象target所在的位置。但是对于2D物体的朝向,我们的目的就是要改变Z轴,通过transform.LookAt只能改变物体的X,Y轴 transform.LookAt的第二个参数是一...
unity lookat导致物体颠倒怎么解决_在Unity 2D如何用一行代码实现LookAt效果,以及向量归一化总结...
weixin_39795284的博客
12-15 1008
被疫情困在家无聊翻翻以前的文章,发现好黑历史啊,虽然是刚学unity的时候写的,后面学习了DX11并且补了3D数学,发现这些问题都是小case了O(∩_∩)O。在我最近制作的小游戏,需要实现防御塔面向小兵的功能。(即物体A需要面向物体B) 这很容易让人想到Unity自带的LookAt()函数,可惜Unity自带的LookAt()函数是3D的,如果把他用在2D游戏上,一样会让物体绕X轴和Y轴旋...
Unity2D实现LookAt
Ha12312的博客
12-21 395
由于Transform.LookAt是使Z轴看向目标,而2D基本是由X和Y轴构成的。所以在2D游戏,不太好使用。 所以用代码实现一个2DLookAt函数。 例子: 我们使怪物的眼睛一直看着云。 怪物的眼睛朝向和localX轴的朝向一致,所以使怪物看着云,即将localx指向云。 给怪物挂上脚本 脚本编写 写法一: voi...
unity使用svg图片
最新发布
qingtian305的专栏
09-06 331
1.安装unitysvg插件,在Package Manager下使用git方式添加com.unity.vectorgraphics,然后会自动安装一个Vector Graphics的插件。svg是矢量图片相对于png等常规图片有很好的清晰度,不会因展示尺寸改变而模糊失真。2.将你的svg图片拖入你的项目,然后修改图片属性。3.最后使用svg图片。
Unity 实现2dLookAt
qq_44979481的博客
02-24 809
本文从原理出发编写2D情况下的LoolAt函数
Unity2DLookAt方法
Su_Ruyu的博客
05-30 1703
https://blog.csdn.net/iov3Rain/article/details/85165183
unity 2d 版的lookAt
a554671102的博客
08-06 317
void LookAt2D(Transform target) { Vector3 dir = target.position - transform.position; float angle = Mathf.Atan2(dir.y, dir.x) * Mathf.Rad2Deg; transform.rota...
公告牌自旋转代码(水平面)(unity3D C#)
01-08
Unity3D游戏引擎,"公告牌自旋转代码(水平面)(unity3D C#)" 是一个常见的功能,主要用于让游戏对象(如2D纹理或平面)始终保持面向玩家的摄像机,这样无论玩家如何移动,游戏对象总是朝向他们。这种效果在3D环境...
Unity制作类胡闹厨房游戏 KitchenChaos 笔记整理
Ziiur的博客
03-10 4051
本文章是油管上CodeMonkey的一个unity项目KitchenChaos的笔记整理,学习并整理这个项目主要是因为终于看到了一个比较完整地用到了unity的各种功能、风格较为清爽的、代码结构清晰的同时比较新的项目,在学习之后有很大的收获。
Unity Shader入门精要学习笔记 - 第11章 让画面动起来
那远远的云端
01-02 1301
Unity Shader入门精要学习笔记 - 第11章 让画面动起来本系列为UnityShader入门精要读书笔记总结, 原作者博客链接:http://blog.csdn.net/candycat1992/article/ 书籍链接:http://product.dangdang.com/23972910.html第11章 让画面动起来没有动画的画面往往让人觉得很无趣。 在本章, 我们将会学
python实现几种归一化方法(Normalization Method)
12-26
数据归一化问题是数据挖掘特征向量表达时的重要问题,当不同的特征成列在一起的时候,由于特征本身表达方式的原因而导致在绝对数值上的小数据被大数据“吃掉”的情况,这个时候我们需要做的就是对抽取出来的features vector进行归一化处理,以保证每个特征被分类器平等对待。下面我描述几种常见的Normalization Method,并提供相应的python实现(其实很简单): 1、(0,1)标准化: 这是最简单也是最容易想到的方法,通过遍历feature vector里的每一个数据,将Max和Min的记录下来,并通过Max-Min作为基数(即Min=0,Max=1)进行数据的归一化处理:
unity游戏开发学习笔记
热门推荐
qq_29231163的博客
09-02 1万+
unity note: 游戏和三维互动内容开发工具,专业游戏引擎 游戏引擎: 一款游戏最核心的代码 包含: 渲染引擎,物理引擎、碰撞检测,音效、脚本引擎、动画系统 人工智能、网络引擎、场景管理。 游戏公司分工 策划、美工、软件工程师、测试工程师、客服 首月: day1: 环境搭建、C#语言基础、Unity API、物理引擎1、3D数学基础、UGUI 程序界面 Project->Assets文件 Hierarchy-> 对象 Scene 右键旋转 滚轮->前进后退 F键—&gt
Unity LookAt 2D锁定
时光不染
12-01 1003
有需求是炮塔锁定怪物,炮管要跟随关务移动旋转。 3D有transform.LookAt()方法,能很方便的锁定怪物。但在uguiLookAt会旋转到很奇怪的方向。 以下是找到的替代方案 Vector3 v = (target.transform.position - transform.position).normalized; transform.up = v;//transform.right = v; 根据个人需求 //做个缓动,效果更好 //transform.up = Vector3.Lerp
UnityUI的LookAt效果实现
lcy的博客
10-11 1260
代码: //参数分别为:1.UI修改目标的Transform 2.朝向向量 3.起始向量 public void UILookAt(Transform transform, Vector3 dir, Vector3 lookAxis) { Quaternion q = Quaternion.identity; q.SetFromToRotation(lookAxis, dir); transform.rotation = q; }
Unity-小工具-LookAt
qq_26318597的博客
12-11 743
Unity-小工具- LookAt
向量归一化的matlab程序,向量X的归一化及其Matlab简单示例
weixin_39673051的博客
03-17 324
徐海蛟博士归一化是要把需要处理的数据经过处理后限制在一定范围内,例如:[-1,1]或[0,1]。归一化是为了后续数据处理的方便,也使得算法程序收敛加快。在Matlab里面,归一化的方法共有3种:(1)mapminmax% 范围映射(2)mapstd% 均值与偏差(3)自定义函数在数据预处理过程,对数据集按行或者按列(统一记为向量X)进行L1或者L2范数归一化是一种常见的处理方式。对于向量X(x1...
Pytorch实现n个向量归一化
飞机火车巴雷特的博客
09-18 1534
pytorch实现n个向量归一化
unity2d如何实现一个任务系统,任务完成之后会自己打勾的代码
04-10
Unity2D实现任务系统,需要考虑以下几个方面: 1. 任务的数据结构与存储:您需要确定任务的属性,如任务的名称、描述、奖励等信息,并选择适当的数据结构进行存储。可以使用ScriptableObject等Unity内置组件...
38
原创
57
点赞
138
收藏
32
粉丝
关注
私信
写文章

热门文章

  • C#定制异常 自定义异常 8110
  • c++图论vector邻接表与链式前向星性能差异 7401
  • C#.NET Thread多线程并发编程学习与常见面试题解析-1、Thread使用与控制基础 6959
  • 自制批量SVG矢量图转普通图片格式小工具 4312
  • 在Unity 2D中如何用一行代码实现LookAt的效果,以及向量归一化小总结 3928

分类专栏

  • python 1篇
  • 并发||异步||并行 4篇
  • C
  • 算法 26篇
  • C++ 27篇
  • PAT 8篇
  • 蓝桥杯 6篇
  • C# 8篇
  • unity 3篇

最新评论

  • c++图论vector邻接表与链式前向星性能差异

    2301_80178201: +1(特意来查区别)

  • c++图论vector邻接表与链式前向星性能差异

    xht20041: 我碰到个更有意思的事情,我用vector能AC,但是完全一样的思路换成链式前向星就会TLE三个点

  • c++图论vector邻接表与链式前向星性能差异

    上口弓日勿: 我好像都这么写的,为什么会影响效率啊,他不是O(1)的吗?

  • c++图论vector邻接表与链式前向星性能差异

    圣诞节快乐,劳伦斯: 其实vector的时间复杂度和链式前向星差不了多少,但是码量少了很多,而且很好查错。(可能是我不熟练前向星吧)

  • C#定制异常 自定义异常

    m0_53471144: 感谢表情包

最新文章

  • 避免错误的使用自定义unique_ptr deleter带来不必要的开销
  • 【CppCon2019】Back to Basics: Move Semantics (part 2 of 2)-学习笔记
  • 【CppCon2019】Back to Basics: Move Semantics (part 1 of 2)-学习笔记
2021年3篇
2020年1篇
2019年16篇
2018年15篇
2017年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家银川卡通玻璃钢雕塑定制冰河世纪玻璃钢树脂动物雕塑玻璃钢花盆制作流程平顶山哪里有玻璃钢彩绘雕塑厂家陕西卡通玻璃钢造型雕塑制作玻璃钢马雕塑设计价格玻璃钢蚂蚁雕塑价位玻璃钢四季女神雕塑鹤岗玻璃钢卡通雕塑设计定西动物玻璃钢雕塑价格长兴玻璃钢雕塑绍兴动物玻璃钢雕塑定做价格特色商场美陈市场价重庆佛像玻璃钢雕塑多少钱深圳走廊商场美陈生产厂家个旧市玻璃钢雕塑设计报价福建高质量玻璃钢雕塑市场中山玻璃钢彩绘雕塑管城区玻璃钢雕塑优质玻璃钢雕塑设计厦门玻璃钢造型雕塑制作厂商场美陈策划张掖抽象人物玻璃钢雕塑多少钱镇江玻璃钢雕塑厂家济南仿铜玻璃钢雕塑安装商场美陈吊饰3d模型郑州铜玻璃钢彩绘雕塑定做玻璃钢雕塑制作设计价位深圳玻璃钢雕塑定做玻璃钢雕塑花车香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化