首先,这是一个非常快速的扩展教程对于那些学习 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 时,几乎每一行代码都需要一个或多个扩展。享受!