扩展方法如何工作?

2023-11-25

我想在 Unity3d 中为 Vector3 类创建一个扩展方法。但我似乎不太明白。这就是我所拥有的:

public static class ExtensionMethods{

    public static Vector3 MaxValue(this Vector3 _vec3)
    {
        return new Vector3(float.MaxValue,float.MaxValue,float.MaxValue);
    }
}

现在我想做一个Vector3.MaxValue就像float.MaxValue用这行代码:

Vector3 closestPoint = Vector3.MaxValue;

但后来我得到这个错误:

error CS0117: `UnityEngine.Vector3' does not contain a definition for `MaxValue'

我知道这会起作用:

Vector3 closestPoint = new Vector3().MaxValue();

但后来我创建了 2 个新的Vector3实例。一个在MaxValue一个电话,一个外面的电话。是不是可以只制作一个并使用这种代码来完成它:

Vector3 closestPoint = Vector3.MaxValue;

首先,这是一个非常快速的扩展教程对于那些学习 c#/Unity 的人 对于任何在这里谷歌搜索的人:

新建一个文本文件HandyExtensions.cs像这样...(请注意,有点令人困惑,您可以使用任何名字对于“保存”您的扩展的类 - 类的实际名称根本不会被使用,并且是不相关的)...

 using UnityEngine;
 using System.Collections;
 using System.Collections.Generic;
 
 public static class HandyExtensions
     {
     public static float Jiggled(this float ff)
         {
         return ff * Random.Range(0.9f,1.1f);
         }
     }

您现在已经发出了一个新的“命令”Jiggle()。您可以在任何float。看哪里写着“这个floatff”。因为它在那里说“float”,所以这个扩展适用于浮动。

如您所见,Jiggled()扩展将采用浮动并稍微改变它。像这样尝试一下

 float x = 3.5f;
 Debug.Log("x is " + x);
 Debug.Log("x is " + x.Jiggled() );
 Debug.Log("x is " + x.Jiggled() );
 Debug.Log("x is " + x.Jiggled() );
 Debug.Log("x is " + x.Jiggled() );
 Debug.Log("x is " + x.Jiggled() );

做一些类似的测试,直到您对扩展有了很好的理解。尽可能多地了解扩展!这是another教程。

现在这个页面上的问题! ...


正如 Mikael 所解释的,您正在寻找的实际上并不是扩展。 (另请注意,如果您想添加一个字段到 Vector3,你不能在 C# 中做到这一点。)

现在,如果你想归还“那个东西”,你需要包含静态类名放在前面,并且您不要将其作为扩展。这只是对静态的正常调用。

wrong...

public static Vector3 MaxValue(this Vector3 _vec3)
{
    return new Vector3(float.MaxValue,float.MaxValue,float.MaxValue);
}

正确的...

public static Vector3 MaxValue()
{
    return new Vector3(float.MaxValue,float.MaxValue,float.MaxValue);
}

然后你可以这样做......

Debug.Log(   ExtensionMethods.MaxValue()  );

我想这可能就是你正在寻找的东西。

你通常会打电话ExtensionMethods像这样短的东西Handy所以你可以写

 Handy.MaxValue();

事实上,因为你不能把“Vector3放在前面”,所以这样的事情会更清楚:

  Handy.MaxVector3();

说得通?

如果你想写这样的东西:Vector3.MaxValue()你不能这样做......因为“Vector3”部分是一个阶级(或结构),而不是变量。例如,这是整数的扩展:

 375.Jiggle();

这是整数的扩展:

 int x;
 x.Jiggle();

但这是没有意义的:

 int.Jiggle();  // meaningless

为了清楚起见,请重复一遍,请注意您问过:

我想在Unity3d中为Vector3类创建一个扩展方法[实际上是一个结构]

扩展只能被调用实际变量,而不是“类或结构”。

   Vector3 hero;
   Vector3 enemy;
   hero.Jiggle();  // works great
   enemy.Jiggle();  // works great
   
   Vector3.Jiggle();  // syntax error - meaningless

还要注意,正如 Mikael 在他的回答中实际上提到的那样,您实际上可以这样做:

  (new Vector3()).Jiggle();

如果你仔细想想,这也是有道理的。我在 C# 中最喜欢的事情之一是你可以使用扩展在普通的旧常量上:

 14.Jiggle();
 7.5f.Radians();

你必须热爱它,除非你从生活中得不到乐趣。这是一个例子:

public static Color Colored( this float alpha, int r, int g, int b )
    {
    return new Color(
        (float)r / 255f,
        (float)g / 255f,
        (float)b / 255f,
        alpha );
    }

然后你可以写..Color c = .5f.Colored(.2f,.4f,.2f);这是一种 alpha 值为 0.5f 的紫褐色。

我一直认为如果您询问的语法可用,如果你可以有一个“类型”或“类”以某种方式作为你扩展的“东西” - 但事实并非如此。对于您想要做的事情,您只需使用一个方便的词,例如,好,方便,然后执行此操作

Vector3 big = Handy.MaxVec3();

我希望这能解释情况!


再次对于任何需要扩展的一般介绍的人来说,intro。这是我最喜欢的一些扩展。

每个游戏项目中都会使用类似以下内容的内容......

public static float Jiggle(this float ff)
    {
    return ff * UnityEngine.Random.Range(0.9f,1.1f);
    }

public static float PositiveOrNegative(this float ff)
    {
    int r = UnityEngine.Random.Range(0,2);
    if (r==0) return ff;
    return -ff;
    }

public static bool Sometimes(this int n)
    {
    if (n<=1) return true;
    int r = UnityEngine.Random.Range(0,n);
    return (r==0);
    }

示例使用..

 if ( 10.Sometimes() )
   {
   explode spaceship
   }

它十次只做一次。

 if ( 3.Sometimes() )
   {
   laser sparkle
   }

在该示例中,它只在大约三分之一的时间内执行此操作。

(请注意,实际上,您通常会在可能的情况下使用泛型进行扩展。为简单起见,此处未显示。)

这是一个方便的扩展技巧。这里有一个真正的高级扩展.

扩展在 Unity 工程中无处不在。

如果您是学习使用 Unity 进行编码的众多人之一……您应该掌握的第一件事就是扩展。试着做几乎所有的带有扩展名。有时,在使用 Unity 时,几乎每一行代码都需要一个或多个扩展。享受!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

扩展方法如何工作? 的相关文章

  • 现代 C++ 编译器是否能够在某些情况下避免调用 const 函数两次?

    例如 如果我有以下代码 class SomeDataProcessor public bool calc const SomeData d1 const SomeData d2 const private Some non mutable
  • 循环遍历 C 结构中的元素以提取单个元素的值和数据类型

    我有一个要求 我有一个 C 语言的大结构 由大约 30 多个不同数据类型的不同元素组成 typedef struct type1 element1 type2 element2 type3 element3 type2 element4 1
  • 有些有助于理解“产量”

    在我不断追求少吸的过程中 我试图理解 产量 的说法 但我不断遇到同样的错误 someMethod 的主体不能是迭代器块 因为 System Collections Generic List 不是迭代器接口类型 这是我被卡住的代码 forea
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 x64 运行 cl?

    我遇到了和这里同样的问题致命错误 C1034 windows h 未设置包含路径 https stackoverflow com questions 931652 fatal error c1034 windows h no include
  • 是否使用 C# 数据集? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 C 中的数据集概念有点困惑 编码 ASP NET 站点 但这并不重要 在我的阅读中 我了解到它们 本质上 用作我的应用程序和我的
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • 将二变量 std::function 转换为单变量 std::function

    我有一个函数 它获取两个值 x 和 y 并返回结果 std function lt double double double gt mult double x double y return x y 现在我想得到一个常量 y 的单变量函数
  • 将 Word 转换为 PDF - 禁用“保存”对话框

    我有一个用 C 编写的 Word 到 PDF 转换器 除了一件事之外 它工作得很好 有时 在某些 Word 文件上 后台会出现一条消息保存源文件中的更改 gt 是 否 取消 但我没有对源文件进行任何更改 我只想从 Word 文件创建 PDF
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • C++ 对象用 new 创建,用 free() 销毁;这有多糟糕?

    我正在修改一个相对较大的 C 程序 不幸的是 并不总是清楚我之前的人使用的是 C 还是 C 语法 这是在一所大学的电气工程系 我们 EE 总是想用 C 来做所有事情 不幸的是 在这种情况下 人们实际上可以逃脱惩罚 但是 如果有人创建一个对象
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • 将 Lambda 表达式树与 IEnumerable 结合使用

    我一直在尝试了解有关使用 Lamba 表达式树的更多信息 因此我创建了一个简单的示例 这是代码 如果作为 C 程序粘贴到 LINQPad 中 它可以工作 void Main IEnumerable
  • 代码中的.net Access Forms身份验证“超时”值

    我正在向我的应用程序添加注销过期警报 并希望从我的代码访问我的 web config 表单身份验证 超时 值 我有什么办法可以做到这一点吗 我认为您可以从 FormsAuthentication 静态类方法中读取它 这比直接读取 web c
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • (Unity 中的 Firebase 数据库)在 Android 构建期间在 Temp 中缺少classes.jar

    I am using Firebase Database in my Unity project but I am having some issues when building the project for android It ru

随机推荐

  • Python 多处理中的子级与父级通信

    我正在编写一个 python 脚本 它将通过将行发送到不同的进程来处理来快速解析文件 最后 我希望父进程接收每个子进程的结果 然后能够对其进行操作 这是代码 usr bin env python import os import re fr
  • 在 Windows 上将 Anaconda 的根 Python 更新到更新的次要版本没有任何作用

    我在 Windows 上安装了 Anaconda 不是 miniconda Python 2 7 我想将安装的 Python 版本更新到最新的次要版本 2 7 9 我看到该版本可以在以下渠道中找到 conda配置为使用 然而 输入conda
  • 修改 NSEvent 以发送与按下的键不同的键

    我正在尝试创建一个 OS X 键盘挂钩用于辅助技术目的 即不用担心 不是键盘记录器 当用户按下某个键时 我想要prevent真正的按键和send而是一个假按键 我选择的角色 我有以下代码 void hookTheKeyboard CGEve
  • 在 C# 项目中包含 FSharp.Core:解决类型冲突

    我正在使用一些 F 类型 Matrix等 来自 C 因此我需要在我的 C 项目中引用 FSharp Core 程序集 到目前为止 一切都很好 但是 显然 mscorlib dll v4 中定义的某些类型在 FSharp Core v2 中
  • 自定义列表排序顺序

    我有一些清单 例如 mylist1 alpha green mylist2 blue alpha red 我想通过这个自定义排序列表对这两个列表进行排序 red blue green alpha so that mylist1 green
  • 寻找与多边形相交尽可能多次的射线

    这是一个有趣的练习 设 P 是一个简单但不一定是凸多边形 q 是不一定在 P 中的任意点 设计一种有效的算法来找到一条源自 q 且与 P 的最大边数相交的线段 换句话说 如果站在q点 你应该把枪瞄准什么方向 这样子弹才能穿过最多数量的墙壁
  • 选择底部导航选项卡后 Android 清除后退堆栈

    使用最新的导航组件与BottomNavigationView the NavController现在默认保存和恢复选项卡的状态 作为此更改的一部分 onNavDestinationSelected BottomNavigationView
  • 在 Windows 上通过计划任务加载 URL 的推荐方法

    我有一个托管在 Windows 机器上的网页 我需要确保每天至少加载一次 我当前的计划是创建一个计划任务 打开 Internet Explorer 并点击 URL C Program Files Internet Explorer iexp
  • 如何使用 FastAPI 从 HTTP 请求中获取 cookie?

    当有人点击 API 时是否可以获取 cookie 我需要读取每个请求的cookie app get async def root text str sessionKey str Header None print sessionKey re
  • AngularJS 的 batarang Chrome 扩展似乎已损坏

    我将这篇文章添加到了 Github 上类似 最近经历的长系列中 我希望这里有人能找到答案 哦 很好 我不只是愚蠢 尝试从书本上自学 Angular 当它调用使用 batarang 来显示一个小示例脚本的范围和模型时 我启动了 bataran
  • 将“物品”平均分配到桶中(尽最大努力)

    说我要分发y项目到x桶均匀 如果x是的倍数y这个分布将是均匀的 如果不是 我最终会得到0每个桶中的物品 例如 例如 我有3桶 我想分配2每个项目 自从做了分工 2 3 将导致0每个桶的物品 我怎样才能实现 分布1 1 0 这种思维方式应该有
  • 如何判断一个方法中调用了哪些方法?

    我想列出从特定方法调用的所有方法 例如 如果我有以下代码 public void test1 test2 test3 该列表应包含 test2 和 test3 如果可以列出同一类的方法以及另一个类的方法 那就太好了 另外 我想找到一种方法来
  • C#/Excel:解决图表上的最大系列大小

    我需要帮助以编程方式绘制比单个 Excel 系列所能容纳的更多点 根据http office microsoft com en us excel HP100738491033 aspxExcel 2007 图表上可显示的最大点数为 2560
  • Android 中的多级 ExpandableListView

    我正在尝试从给定的未知大小或级别的类别列表创建类别树 所以我试图创建一个通用的可扩展列表 其中可以包含 2 个以上的级别 总体思路是在其布局中向每个有子级的子级添加另一个 ExpandableListView 问题是第二个级别无法打开 看起
  • 在 @PostConstruct 期间使用 @Cacheable 的 Spring 缓存不起作用

    与spring框架中的commit相关https github com spring projects spring framework commit 5aefcc802ef05abc51bbfbeb4a78b3032ff9eee3 初始化
  • Spring Security 3.0.2 的 OpenId 身份验证和自动注册

    我正在使用 spring security 3 0 2 和 OpenId 登录和注册来实现一个应用程序 我可以成功登录 但如果用户未注册 我想要执行以下操作 1 获取一些 OpenId 属性 例如电子邮件和姓名 2 向用户显示仅包含这两个字
  • 如何列出 MySQL 中缓存的查询? (Qcache_queries_in_cache)

    显示 Qcache queries in cache 等状态返回 Variable name Value Qcache queries in cache 327 如何打印这些 327 查询 为了优化 mysql 缓存 我想尝试切换到 按需
  • 如何在 Scala 2.9.0 中实现 Hadoop Mapper?

    当我从 2 8 1 迁移到 Scala 2 9 0 时 除了 Hadoop 映射器之外 所有代码都可以正常运行 因为我有一些包装对象 所以我总结为以下示例 import org apache hadoop mapreduce Mapper
  • 如何在 Java 中对二维数组进行深层复制?

    我刚刚使用了一点 clone 在我的第二天booleanarray 认为这是一个深拷贝 我怎样才能执行我的深度复制boolean array 我应该循环它并做一系列System arraycopy s 是的 您应该迭代二维布尔数组才能深度复
  • 扩展方法如何工作?

    我想在 Unity3d 中为 Vector3 类创建一个扩展方法 但我似乎不太明白 这就是我所拥有的 public static class ExtensionMethods public static Vector3 MaxValue t