我实际上正在努力将最初使用UnityScript的Unity项目转换为C#。我已经翻译了项目的很大一部分,但我遇到了一些问题:
第一个问题与产量:
相关联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
似乎.y不被考虑,但在js我工作正常。如何在C#中处理它?</ p>
答案 0 :(得分:3)
在JS中,
yield; // this means that wait for one frame
在C#中,
yield return null;
我不是100%肯定,但是对于屈服攻击();
应该是
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);
抱歉,如果我有问题。
答案 1 :(得分:0)
我想将Cyclops answer复制为yield语句。
Unity C#与Unity Javascript的收益
尽管Unity的文档(简要地)涵盖了在编写C#脚本时使用Yield的语法差异(步骤4),但还有一个涵盖How do I Use Yield in C#的Unity Answer,其中有更详细的解释。此外,equalsequals的答案还有一个值得一试的Coroutine教程的链接。
Unity的Yield比.NET C#Yield
具有更多功能上一段介绍了Unity的C#与Javascript语法的差异。但是,我认为值得解释的是Unity的Yield语句(在C#和Javascript中)的行为都有一些额外的功能,而不是微软的.Net C#行为。
基本上,Unity已将YieldInstruction(以及WaitForSeconds之类的子类)添加到Yield。这些类使Yield能够暂时暂停该功能,直到满足条件。如果参数为零,则暂停一帧。如果它的参数为WaitForSeconds:
yield return new WaitForSeconds (2.0f); // pauses for 2 seconds.
然后它会暂停几秒钟。如果参数是另一个Coroutine,则它会暂停,直到Coroutine完成。
**
产量只能在Coroutine中使用。开始一个Coroutine C#,你使用StartCoroutine,而它是自动调用的 的JavaScript。
**
第二个问题答案 您需要记住上面给出的链接所描述的基本差异。我很快就能说出来:
这是因为您使用C#进行编码。在javascript中,编译器允许你修改transform.position的conmponent值,但是在C#中它没有 - 你必须创建一个全新的Vector3并在一次操作中分配它。
在Javascript中,编译器基本上“隐藏”了它在幕后为您执行此操作的事实。more