我希望场景中的许多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位置被修改。
答案 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;
}
最后,如果你只想在某个地方为某个地方制作动画,你应该进入令人惊奇的
这是游戏工程的可卡因:
https://stackoverflow.com/a/37228628/294884
Unity的一个巨大问题是人们经常没有意识到制作游戏有多么简单。 (有许多经典的例子:你会得到1000个问题,询问如何在Unity中制作一个(完全无关紧要的)计时器,其中OP使用协同程序将自己捆绑在一起。当然,你只需使用Invoke
或InvokeRepeating
99%的时间用于Unity中的计时器。计时器是游戏引擎中最基本的部分之一:当然,显然是通过一种微不足道的方式实现统一。)
这是"文件夹" (实际上只是一个毫无意义的空游戏对象,这些模型坐在它下面)在游戏场景中持有一些模型。
这些是游戏中的一些敌人。作为一名工程师,我只是把它们放在那里,游戏"设计师"会出现并设定品质(因此,马铃薯很快,萝卜实际上是一个不可杀戮的老板,飞行头连接谷歌地图或其他)。
相同的交易,这是来自"文件夹" (另外,如果你使用一个空的游戏对象作为一个好的文件夹来保持屎,它通常被称为"文件夹" - 它不仅仅是一个游戏对象与一些" peeps" ("球员射弹")。同样,这些是游戏中使用的非常模型。所以很明显,这些只是坐在屏幕外,就像游戏一样。看,他们在这里,只是坐在" -10"或相机之外的东西(一个记住Unity的好地方"相机"只不过是...... GameObject
带有某些组件(为了方便起见,Unity已经写过了。)
(同样:在许多情况下,您可能更喜欢使用预制件 .Unity提供两种方法:预制件,或者#34;只是坐在屏幕外"。就我个人而言,我建议有很多方法可以说,只是坐在屏幕外#34;因为它会让你设计正确的状态等等;你本来就必须有一个等待状态等等等等等等这是非常重要的。我强烈建议你,首先,只是让你的模特在屏幕外坐下来,一开始就不要使用预制件。无论如何,&#39 ;另一个问题。)
这里确实其中一些偷看......
感谢上帝,我出生时是一名工程师,而不是一名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中最重要的事情之一! :)
注意" Header"事情是有效的,特别是当你通过派生链下来。在一个每个人都这样工作的大项目上工作很快乐,为你的模特制作超级整洁,超清晰的Inspector面板。这是" Unity得到它真正正确的情况"。等到你搞定他们搞砸了的东西! :o
答案 1 :(得分:2)
请考虑Joe说的话,但是为了将多个参赛者传递给代表,你可以使用这个iirc:
public delegate void DoStuffToTransform(params Transform[] transform);