将不同的参数传递给代表

时间:2016-07-15 14:10:17

标签: c# events unity3d delegates unity5

我希望场景中的许多GameObjects以编程方式“动画”Y位置。我有一个类,我们称之为“TheGameObject”,它不会从MonoBehaviour继承,因此不能拥有我需要的Update()函数来实现GameObjects的Y移动。 我决定尝试使用委托,但后来出现了一个问题:我只能将一个Transform传递给委托。

这是静态类中委托的代码,我们称之为“staticClass”,它来自MonoBehaviour:

public delegate void UpdatingEventHandler(Transform t);
public static event UpdatingEventHandler Updating;

void Update() {
    if(Updating != null)
        Updating(/*Transform that should be passed*/);
}

这是“TheGameObject”类中的代码:

public GameObject gameObject { get; set; }

private void spawn() {
  GameObject go = new GameObject();
  staticClass.Updating += animateYpos(go.transform);
}

void animateYpos(Transform t) {
  //modify t.position.y
}

有没有办法将每个相应的Transform传递给委托,以便在静态类Update()中调用Updating()并分别移动所有GameObjects? 问题不在于传递的参数的类型,而是传递变换,以便每个不同的变换都有自己的Y位置被修改。

2 个答案:

答案 0 :(得分:3)

这完全错了,Cress!

对于经验丰富的开发人员来说,不太了解Unity

非常普遍

不是面向对象的,完全没有与继承等概念的联系。

(当然,目前用于在Unity中编写组件的编程语言恰好是OO,但这在很大程度上是不相关的。)

好消息是,解决方案非常简单。

您在Unity中所做的只是编写符合您需要的行为

关于它的论文...... https://stackoverflow.com/a/37243035/294884

尝试获得这个概念:假设你有一个机器人攻击设备"在你的游戏中。

因此,Unity场景中唯一的东西就是GameObjects。 (没有别的 - 根本没有。)

您的机器人攻击设备"会有这些行为。 ("行为"意味着附属于它的组件。组件是MonoBehavior。)

  

"机器人攻击装置"
  •动画Z位置
  •每十秒拍摄一次   •响应具有音效的bashes

等等。

然而,你的"卡哇伊花"可能有这些行为

  

"卡哇伊花固定NPC"
  •每5秒拍摄一次   •响应具有音效的bashes
  •彩虹动画

在这种情况下,你要问如何写一个"动画Y"行为。

这很简单,首先请注意所有内容 - 一切 - 您在Unity中使用扩展程序进行操作,因此它会像

一样
public static void ForceY( this Transform tt, float goY )
    {
    Vector3 p = tt.position;
    p.y = goY;
    tt.position = p;
    }

有关扩展程序的快速教程:https://stackoverflow.com/a/35629303/294884

然后关于为Y动画制作的琐碎组件(所有组件都是微不足道的),它只是像

一样
public class AlwaysMoveOnYTowards:MonoBehaviour
 {
 [System.NonSerialized] public float targetY;
 void Update()
  {
  float nextY = .. lerp, or whatever, towards targetY;
  transform.ForceY(nexyT);
  }
 }

请注意,当然,您只需根据需要打开和关闭该组件即可。所以,如果事情是睡着了或游戏中的任何东西

thatThing.GetComponent()。enabled = false;

以及稍后true当您再次想要这种行为时。

回想一下,你所做的就是为yoru游戏(LaraCroft,恐龙,kawaiiFlower,bullet ......等等)制作模型

(回想一下两种方式在Unity中使用模型,要么使用Unity的预制系统(有些人喜欢,有些人不要)或只是让模特坐在屏幕外然后根据需要实例化或使用。)

{请注意,最近Unity中的混淆(选择一个)是:直到几年前,你必须为自己拥有的东西编写自己的池。那些日子早已过去,现在永远不会聚集在一起。只是实例化。 Unity的一个巨大问题是完全过时的示例代码。}

BTW这里是与UI系统相同的ForceY

public static void ForceYness(this RectTransform rt, float newY)
    {
    Vector2 ap = rt.anchoredPosition;
    ap.y = newY;
    rt.anchoredPosition = ap;
    }

最后,如果你只想在某个地方为某个地方制作动画,你应该进入令人惊奇的

Tweeng

这是游戏工程的可卡因:

https://stackoverflow.com/a/37228628/294884

Unity的一个巨大问题是人们经常没有意识到制作游戏有多么简单。 (有许多经典的例子:你会得到1000个问题,询问如何在Unity中制作一个(完全无关紧要的)计时器,其中OP使用协同程序将自己捆绑在一起。当然,你只需使用InvokeInvokeRepeating 99%的时间用于Unity中的计时器。计时器是游戏引擎中最基本的部分之一:当然,显然是通过一种微不足道的方式实现统一。)

这是"文件夹" (实际上只是一个毫无意义的空游戏对象,这些模型坐在它下面)在游戏场景中持有一些模型。

enter image description here

这些是游戏中的一些敌人。作为一名工程师,我只是把它们放在那里,游戏"设计师"会出现并设定品质(因此,马铃薯很快,萝卜实际上是一个不可杀戮的老板,飞行头连接谷歌地图或其他)。

相同的交易,这是来自"文件夹" (另外,如果你使用一个空的游戏对象作为一个好的文件夹来保持屎,它通常被称为"文件夹" - 它不仅仅是一个游戏对象与一些" peeps" ("球员射弹")。同样,这些是游戏中使用的非常模型。所以很明显,这些只是坐在屏幕外,就像游戏一样。看,他们在这里,只是坐在" -10"或相机之外的东西(一个记住Unity的好地方"相机"只不过是...... GameObject带有某些组件(为了方便起见,Unity已经写过了。)

enter image description here

(同样:在许多情况下,您可能更喜欢使用预制件 .Unity提供两种方法:预制件,或者#34;只是坐在屏幕外"。就我个人而言,我建议有很多方法可以说,只是坐在屏幕外#34;因为它会让你设计正确的状态等等;你本来就必须有一个等待状态等等等等等等这是非常重要的。我强烈建议你,首先,只是让你的模特在屏幕外坐下来,一开始就不要使用预制件。无论如何,&#39 ;另一个问题。)

enter image description here

这里确实其中一些偷看......

enter image description here

enter image description here

感谢上帝,我出生时是一名工程师,而不是一名wanker"游戏设计师"所以有其他人出现并设置他们认为合适的那种东西。 (当然,确实增加了非常重要的(从玩家的角度来看)Component,例如,你知道,"渲染器",声音效果等。

注意,Cress:您可能会注意到上述:因为"生活就像那样"在那里的命名(它纯粹是一个命名问题,而不是一个深层问题)我们非常不明智地反对我在这里描述的内容。所以,请注意我有一个应该命名的组件,例如," Killableness"或者只是"弹丸"或者确实只是"权力"或者"速度"。只是因为生活就是这样,我相当不明智地将它命名为#34;导弹"或者"抛射物"而不是确实"航班"或者" attackPower"。您可以看到 非常非常糟糕 ,因为当我重复使用组件" attackPower" (在这里愚蠢地命名"导弹")在下一个项目中,包括说机器人挖掘机或者其他东西而不是导弹,每个人都会尖叫着我 " Dude为什么我们的攻击力与我们的机器人蜘蛛相连的组件,叫做导弹'而不是'攻击力',WTF?" 我确定你明白我的意思。

请注意,有一个很好的例子,而Unity和GameObject 完全没有连接与计算机科学或编程有关,它是' s完全正常 - 如果令人困惑 - 在编写组件中你必须是OO的主人,因为(当它发生) Unity使用的当前语言确实恰好是OO语言(但请记住,他们可以随时改为使用Lisp或其他东西,它不会从根本上影响Unity。作为一名经验丰富的程序员,你会立即看到(对于这里讨论的组件)我有类似基类" Flightyness"然后有子类如#34; ParabolaLikeFlightyness"" StraightlineFlightyness"" BirdFlightyness& #34;" NonColliderBasedFlightyness"" CrowdNetworkDrivenFlightyness"" AIFlightyness"依此类推;你可以看到每个人都有"一般"设置(对于Steve来说游戏设计师 调整)和更具体的设置(再次为史蒂夫调整)。一些随机代码片段对你来说很有意义......

public class Enemy:BaseFrite
    {
    public tk2dSpriteAnimator animMain;
    public string usualAnimName;
    [System.NonSerialized] public Enemies boss;

    [Header("For this particular enemy class...")]
    public float typeSpeedFactor;
    public int typeStrength;
    public int value;

public class Missile:Projectile
    {
    [Header("For the missile in particular...")]
    public float splashMeasuredInEnemyHeight;
    public int damageSplashMode;

注意使用[Header ...... Unity中最重要的事情之一! :)

enter image description here

注意" Header"事情是有效的,特别是当你通过派生链下来。在一个每个人都这样工作的大项目上工作很快乐,为你的模特制作超级整洁,超清晰的Inspector面板。这是" Unity得到它真正正确的情况"。等到你搞定他们搞砸了的东西! :o

答案 1 :(得分:2)

请考虑Joe说的话,但是为了将多个参赛者传递给代表,你可以使用这个iirc:

public delegate void DoStuffToTransform(params Transform[] transform);