Unity中的Vector2的使用方法

这篇具有很好参考价值的文章主要介绍了Unity中的Vector2的使用方法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Vector2表示2D向量和点

1.静态变量

  void Start()
    {
        //静态变量
        print(Vector2.down);
        print(Vector2.up);//Y轴正方向
        print(Vector2.left);
        print(Vector2.right);//X轴正方向
        print(Vector2.one);//单位化向量(1.1)
        print(Vector2.zero);//用来获取坐标原点

    }

2.构造函数

  void Start()
    {
        Vector2 v2 = new Vector2(2, 2);
        print("v2的向量是:"+v2);//输出 v2的向量是:(2.00,2.00) 
    }

3.成员变量(注意:开头小写的)

       print("v2向量的模长是"+v2.magnitude);//√下x²+y²,输出: v2向量的模长是:2.828427
       print("V2向量的模长的平方是:" + v2.sqrMagnitude);// 输出: V2向量的模长的平方是:8
       print("V2向量单位化之后是:" + v2.normalized);//输出v2长度为1的单位向量,输出 V2向量单位化之后是:(0.71, 0.71)
       print("V2向量的XY值分别是:" + v2.x + "," + v2.y);//输出: V2向量的XY值分别是:2,2
       print("V2向量的XY值分别是(使用索引器形式访问):" + v2[0] + "," + v2[1]);//输出: V2向量的XY值分别是(使用索引器形式访问):2,2

4.公共函数(注意:开头大写的)

(1).判断两个向量是否相等(Equals)

  void Start()
    {
        Vector2 v2 = new Vector2(2, 2);
        bool equal = v2.Equals(new Vector2(1, 1));//通过Equals判断V2与new Vector2(1, 1)是否相等
        print("V2向量与向量(1,1)是否相等?" + equal);//输出:V2向量与向量(1,1)是否相等?False

        //通过以下代码可以得出,Equals判断需要两个向量的模长和方向都相等
        //判断(1,3)和(3,1)是否相等
        Vector2 v2E = new Vector2(1, 3);
        bool equalv2E = v2E.Equals(new Vector2(3, 1));
        print("v2E向量与向量(3,1)是否相等?" + equal);//输出:"v2E向量与向量(3,1)是否相等?" False
    }

(2).设置Vector2的值

  void Start()
    {
        Vector2 v2 = new Vector2(2, 2);
        v2.Normalize();//将V2使用Normalize()向量单位化
        print("V2向量是:" + v2);//输出: V2向量是:(0.71, 0.71)

        v2.Set(5, 9);//设置v2的向量为(5,9)
        print("V2向量是:" + v2);//输出:V2向量是:(5, 9)
    }
a. transform.position不可以单独赋值,需要整体赋值

通过查看底层代码可以看到Transform中的position是属性而不是公有字段
position的类型是Vector3,而Vector3是struct结构体

结论1:用属性和方法返回的结构体是不能修改其字段的

public class No7_Vector2 : MonoBehaviour
{
  void Start()
    {
        Vector2 v2 = new Vector2(2, 2);
        //这种写法会报错
        transform.position.x = 4;//不可以单独赋值某一个值,比如x 
        
        //需要整体赋值 
        transform.position=v2;
        transform.position=new Vector2(3,3);
        //或者单独拿出来再进行赋值
        Vector2 vector2 = transform.position;
        vector2.x = 2;
        transform.position = vector2;
    }
}

结论2:直接访问公有的结构体是可以修改其字段的

值类型 Value Type

  • 值类型赋值,是 copy。即值的拷贝。
  • 值类型中,存储的是它的数值
public class No7_Vector2 : MonoBehaviour
{   
    public struct MyStruct
    {
        public string name;
        public int age;
    }
  void Start()
    {
        MyStruct myStruct = new MyStruct();//A
        myStruct.name = "jokey";
        myStruct.age = 10;
        MyStruct yourStruct = myStruct;//B
        yourStruct.name = "xiao";
        yourStruct.age = 20;
        print("原本的结构体对象名字是:" + myStruct.name);//输出 原本的结构体对象名字是:jokey
        print("修改后的结构体对象名字是:" + yourStruct.name);//输出 修改后的结构体对象名字是:xiao
    }
}

引用类型 Reference Type

  • 引用类型赋值,是 引用。传递的是地址
  • 引用类型中,存的是指向它真实数据的地址
public class No7_Vector2 : MonoBehaviour
{   
       public class MyClass
    {
        public string name;
        public int age;
    }
  void Start()
    {
        MyClass myClass = new MyClass();//A
        myClass.name = "jokey";
        myClass.age = 10;
        MyClass yourClass = myClass;//B跟A是同一块内存空间
        yourClass.name = "xiao";
        yourClass.age = 20;
        print("原本的结构体对象名字是:" + myClass.name);//输出: 原本的结构体对象名字是:xiao
        print("修改后的结构体对象名字是:" + yourClass.name);//输出: 修改后的结构体对象名字是:xiao
    }
}

总结导致这个问题的原因:
1.Transform中的position是属性(换成方法也一样,因为属性的实现本质上还是方法)而不是公有字段
2.position的类型是Vector的,而Vector是Struct类型
3.Struct之间的赋值是拷贝而不是引用。也就是你修改的游戏物体A,修改的并不是A,而是经过copy后的B,所以这时你对B进行的任何修改都作用不到A上。
unity vector2,unity,unity,游戏引擎,c#

5.静态函数

  void Start()
    {
        Vector2 va = new Vector2(1, 0);
        Vector2 vb = new Vector2(0, 1);
        print("从va指向vb方向计算的无符号夹角是:" + Vector2.Angle(va, vb));//输出: 从va指向vb方向计算的无符号夹角是:90
        print("va点与vb点之间的距离是:" + Vector2.Distance(va, vb));//输出: va点与vb点之间的距离是:根号2(1.414214)
        print("向量va与向量vb的点积是:" + Vector2.Dot(va, vb));//输出:向量va与向量vb的点积是:0
        
        //具体得到的新向量的结果的计算公式是:a+(b-a)*t,a指va,b指vb,t指计算比例
        print("va向vb按照0.5的比例进行线性插值变化之后的结果是" + Vector2.Lerp(va, vb, 0.5f));//输出:(0.50, 0.50)  

        print("va向vb按照参数为-1的形式进行(无限制)线性插值变化之后的结果是" + Vector2.LerpUnclamped(va, vb, -1));//输出:(2.00, -1.00)

        float maxDistance = 0.5f;
        print("将点va以最大距离不超过maxDistance为移动步频移向vb" + Vector2.MoveTowards(va, vb, maxDistance)); //输出; (0.65, 0.35)

        print("va和vb之间的有符号角度(以度为单位,逆时针为正)是" + Vector2.SignedAngle(va, vb));//输出:90
        print("vb和va之间的有符号角度(以度为单位,逆时针为正)是" + Vector2.SignedAngle(vb, va));//输出:-90

        print("va和vb在各个方向上的分量相乘得到的新向量是:" + Vector2.Scale(va, vb));//输出:(0.00, 0.00)
        
        //平滑阻尼
        Vector2 currentVelocity = new Vector2(1, 0);
        print(Vector2.SmoothDamp(va, vb, ref currentVelocity, 0.1f));
    }

在update()中实测用法文章来源地址https://www.toymoban.com/news/detail-718829.html

public class No7_Vector2 : MonoBehaviour
{
    public Transform grisTrans;//游戏物体位置
    public Transform targetTrans;//移动到的目标位置

    public float percent;
    public float lerpSpeed;
    Vector2 currentVelocity = new Vector2(1, 0);
void Update()
    {
        //1.使用Lerp()
        grisTrans.position= Vector2.Lerp(grisTrans.position, targetTrans.position, 0.01f);

        //2.使用lerp进行匀速移动
        percent += 1 * lerpSpeed * Time.deltaTime;
        grisTrans.position = Vector2.Lerp(grisTrans.position, targetTrans.position, percent);

        //3.使用moveTowards()
        //lerp是先快后慢,moveTowards匀速
        grisTrans.position = Vector2.MoveTowards(grisTrans.position, targetTrans.position, 0.01f);

        //平滑阻尼SmoothDamp
        //和使用第一种Lerp效果相似   
        Vector2 currentVelocity = new Vector2(1, 0);
        grisTrans.position = Vector2.SmoothDamp(grisTrans.position, targetTrans.position, ref currentVelocity, 1);
    }
}

到了这里,关于Unity中的Vector2的使用方法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity中常用函数使用方法

    Update() 正常更新,创建 JavaScript 脚本时默认添加这个方法,每一帧都会由系统调用一次该方法。 LateUpdate() 推迟更新,此方法在 Update() 方法执行完后调用,每一帧都调用一次。 FixedUpdate() 置于这个函数中的代码每隔一定时间执行一次。 Awake() 脚本唤醒,用于脚本的初始化,在

    2024年02月08日
    浏览(26)
  • Unity ScriptableObject 使用方法详解

    ScriptableObject类 直接继承自Object类;它和 MonoBehaviour 是并列的,都继承自Object(但MonoBehaviour并不是直接继承自Object); ScriptableObject 就是一个数据容器,可以用来存储大量的数据,它是可序列化的,这个特点也正决定了它的主要用途;一个 主要用处就是通过将数据存储在Sc

    2024年02月08日
    浏览(29)
  • unity 2D射线的使用方法

    Ray2D ray;     void Update()     {         ray = new Ray2D(transform.position, Vector2.right);         RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction,10);         //Debug.DrawRay(ray.origin,ray.direction,Color.blue);         if (info.collider != null)         {             if (info.transform.gameO

    2024年02月15日
    浏览(32)
  • Unity——DOTween插件使用方法简介

      缓动动画既是一种编程技术,也是一种动画的设计思路。从设计角度来看,可以有以下描述 事先设计很多基本的动画样式,如移动、缩放、旋转、变色和弹跳等。但这些动画都以抽象方式表示,一般封装为程序函数 动画的参数可以在使用时指定,如移动的起点和终点、旋

    2024年02月05日
    浏览(35)
  • Unity——各种特效的基本使用方法

    特效是游戏制作不可或缺的一环,作为游戏开发者最重要的工作就是将特效添加到游戏中,并在合适的时机、合适的位置将特效播放出来,同时还要注意特效的管理和销毁。 某些种类的特效,如动效、贴花,还要编写脚本代码以实现更细节的控制。因此本文将简单介绍各种特

    2024年02月08日
    浏览(28)
  • unity,Mathf.Clamp方法的使用

    Mathf.Clamp是Unity引擎中的一个静态方法,用于将一个值限制在指定的范围内。它可以用于限制数值、位置和旋转等属性的取值范围,以确保它们不会超出指定的范围。 Mathf.Clamp方法的语法如下: 其中,value表示要限制的值,min表示限制范围的最小值,max表示限制范围的最大值。

    2024年02月07日
    浏览(32)
  • 关于Unity Physics.CheckBox的使用方法

    在UnityAPI手册中Physics.CheckBox是Unity Physics类中的一个方法,该方法拥有四个重载,用于检查给定的盒体是否与其他碰撞体重叠。 public static bool CheckBox (Vector3 center, Vector3 halfExtents, Quaternion orientation= Quaternion.identity, int layermask= DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteracti

    2024年01月21日
    浏览(27)
  • Unity中使用WebSocket (ws://)的方法

    WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。 其实从历史上来讲,websocket是为了克服http无法双向通信而引

    2024年02月09日
    浏览(33)
  • Unity Render Streaming使用方法,WebRTC的基础搭建使用

    Unity渲染流包含构建在Unity Render Streaming之上的公共 API 和项目示例。可以使用Unity Render Streaming包快速开发一个点对点的流媒体解决方案。 该软件包提供的功能包括视频流、音频流和操作控制。 Render Streaming所需环境:WebRTC,nodejs, 我们先安装WebRTC 参考链接:Install package | W

    2024年02月15日
    浏览(23)
  • Unity使用进度条加载实现场景切换(简单方法)

     我们实现场景切换时一般使用方法:  这种方法可以实现场景页面的直接切换,但在切换场景前想加这种进度条的方式该如何实现呢? 接下来小编为大家讲解一种非常简单的方法供参考。 1.找一张实现页面切换的背景图片(任何图片都可),记得将其改为“精灵模式”。

    2024年02月13日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包