将UnityScript翻译为C#:yield和transform.position

3

我正在将一个使用UnityScript编写的项目翻译成C#。我已经成功翻译了很大一部分,但是现在遇到了一些问题:

第一个问题与yield有关:

yield Attack();
yield;

我已经替换了所有的:yield WaitForSeconds(),但我不知道如何替换这个。

其次,transform.position还有另一个问题:

transform.eulerAngles.y += Input.GetAxis("Horizontal") * speedIdleRotate;
transform.position.y = currentHeight;

抛出错误:

UnityEngine.Transform.eulerAngles is not a variable
UnityEngine.Transform.position is not a variable

似乎在 C# 中 .y 是无法识别的,但在 JavaScript 中可以正常工作。如何在 C# 中解决这个问题?


1
yield出了什么问题?JS有没有使用它的用途?因为C#使用它来构建可枚举集合。 - D. Ben Knoble
@PokeRwOw 展示你的原始JS代码以及你目前的C#代码,包括Attack()yield周围的方法。 - Roman Dibikhin
2个回答

3

在JS中,

yield; // this means that wait for one frame

在C#中,

yield return null;

我不是100%确定,但对于yield Attack();

应该是

yield return Attack();

为了,
transform.eulerAngles.y += Input.GetAxis("Horizontal") * speedIdleRotate;

试试这个:

transform.eulerAngles = new Vector3( transform.eulerAngles.x , transform.eulerAngles.y + Input.GetAxis("Horizontal") * speedIdleRotate , transform.eulerAngles.z);

对于,
transform.position.y = currentHeight;

试试这个:

transform.position =new Vector3(transform.position.x,currentHeight,transform.position.z);

如果我有什么不对的地方,请原谅。


谢谢你的回答,你说的都有效,除了yield return new Attack()。它给我抛出了以下错误:Attack()是一个方法,但被用作类型。 - PokeRwOw
1
我只是将 "yield return new Attack();" 替换为 "yield return Attack();",现在它可以正常工作了! - PokeRwOw

0

我想要复制Cyclops的答案来使用yield语句。

Unity C#中的Yield与Unity Javascript中的Yield

虽然Unity的文档在编写C#脚本(第4步)时简要介绍了使用Yield的语法差异,但也有一个Unity Answer涵盖了如何在C#中使用Yield,其中有更详细的解释。此外,equalsequals的答案还链接到了一个值得一看的协程教程。

Unity的Yield比.NET C# Yield具有额外的功能

上面的段落介绍了Unity的C#与Javascript语法的区别。然而,我认为值得解释的是,Unity的Yield语句的行为(无论是在C#还是Javascript中),具有一些Microsoft的.Net C#行为中没有的附加功能。

基本上,Unity已经将YieldInstruction(以及其子类,如WaitForSeconds)添加到Yield中。这些类使Yield能够暂时暂停函数,直到满足条件。如果它没有任何参数,则暂停一个帧。如果它有一个WaitForSeconds参数:
yield return new WaitForSeconds (2.0f); // pauses for 2 seconds.

然后它会暂停一段时间。如果参数是另一个协程,则它会等待该协程完成。

**

只有在 Coroutine 中 Yield 才能这样使用。在 C# 中,要启动一个 Coroutine,您需要使用 StartCoroutine,而在 Javascript 中则会自动调用它。

**

回答第二个问题时,您需要记住上面给出的链接所描述的基本差异。简单地说:

这是因为您正在使用C#进行编码。在Javascript中,编译器允许您修改transform.position的组件值,但在C#中,它不允许 - 您必须创建一个全新的Vector3并在一次操作中进行分配。

在Javascript中,编译器基本上“隐藏”了它在幕后为您执行此操作的事实。

更多信息


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接