unity游戏引擎-UnityScript到C#代码

本文关键字:代码 -UnityScript 游戏 引擎 unity | 更新日期: 2023-09-27 17:58:06

我在UnityScript中有一个代码,我想在C#中转换它,但事情就是这样。

Assets/My Scripts/projectileShot2.cs(23,52): error CS0019: Operator * cannot be applied to operands of type 'UnityEngine.Quaternion' and 'float'
Assets/My Scripts/projectileShot2.cs(22,36): error CS0029: Cannot implicitly convert type 'UnityEngine.Vector3' to 'UnityEngine.Quaternion'
Assets/My Scripts/projectileShot2.cs(21,35): error CS0266: Cannot implicitly convert type 'UnityEngine.Object' to 'UnityEngine.Transform'. An explicit conversion exists (are you missing a cast?)

这是UnityScript 的代码

#pragma strict
function Start () {    
}
var canonPrefab : Transform;
var speed = 0f ;
var angle = 0f;
var time = 5.0f;
function Update(){
if(Input.GetButtonDown("Fire1"))
{
    var canon: Transform =  Instantiate (canonPrefab, transform.position,Quaternion.identity);
    var shootDir = Quaternion.Euler(0, 0, angle) * Vector3.right;
    canon.rigidbody.velocity = shootDir * speed;
    Destroy(canon, 5.0f);
}
if(Input.GetKey (KeyCode.Q)){
        transform.Rotate (new Vector3(0, 0, 30.0f) * Time.deltaTime);
        angle += 1;
    }
if(Input.GetKey (KeyCode.E)){
        transform.Rotate (new Vector3(0, 0, -30.0f) * Time.deltaTime);
        angle -= 1;
    }
}

这就是C#代码

using UnityEngine;
using System.Collections;
public class projectileShot2 : MonoBehaviour {

    public Transform cannonPrefab;
    public float speed = 0f;
    public float angle = 0f;
    public float time = 0f;

    // Use this for initialization
    void Start () {
    }
    // Update is called once per frame
    void Update () {
        if (Input.GetButtonDown("Fire1")){
            Transform canon = Instantiate(cannonPrefab, transform.position, Quaternion.identity);
            Quaternion shootDir = Quaternion.Euler(0, 0, angle) * Vector3.right;
            canon.rigidbody.velocity = shootDir * speed;
        }
        if(Input.GetKey (KeyCode.Q)){
            transform.Rotate (new Vector3(0, 0, 30.0f) * Time.deltaTime);
            angle += 1;
        }
        if(Input.GetKey (KeyCode.E)){
            transform.Rotate (new Vector3(0, 0, -30.0f) * Time.deltaTime);
            angle -= 1;
        }
    }
}

我仍然是这个脚本的新手,仍然不熟悉数据类型。我希望你能帮助我。谢谢!

unity游戏引擎-UnityScript到C#代码

我在工作中多次遇到这种情况,并大量使用ILSpy。您可以将其编译为程序集(Library/ScriptAssemblies/assembly-*.dll文件),然后使用ILSpy将结果读取并反编译为您选择的语言(如C#)。

它有一些错误和怪癖,你仍然需要克服,但由于它为你做了所有繁重的工作,你只需手动调整即可适应代码的其余部分。

编辑1:

在线23上,您有:

canon.rigidbody.velocity = shootDir * speed;

shootDir是一个四元数,虽然你可以乘以Vector3(这里有更多的解释),但你不能乘以speed。尝试speed * Vector3.forward或其他方向。

编辑2:

21行,您需要将其从Instantiate(cannonPrefab,更改为Instantiate(cannonPrefab.gameObject,

编辑3:

我不完全确定第22行,但我想知道如果将=符号的所有内容都用括号括起来会发生什么,以及这是否会消除错误/警告。

如果您在正确的数据类型方面遇到问题,您可以随时查看Unity Scripting Reference。我在下面的答案中链接了相应的网站。让我们检查一下每个错误以及编译器抱怨的原因。

第21行:

Cannot implicitly convert type 'UnityEngine.Object' to 'UnityEngine.Transform'. An explicit conversion exists (are you missing a cast?)

您正试图将Object分配给Transform变量,虽然编译器本身无法处理它,但它已经向您提示了什么是正确的解决方案。

Instantiate总是返回一个Object作为结果,所以您必须使用关键字as将其强制转换回预制的类型。在这种情况下,您正在克隆一个Transform对象,因此正确的代码是:

Transform canon = Instantiate(cannonPrefab, transform.position, Quaternion.identity) as Transform;

第22行:

Cannot implicitly convert type 'UnityEngine.Vector3' to 'UnityEngine.Quaternion'

现在您正试图将Vector3分配给Quaternion变量,而编译器同样无法处理此问题。

如果将QuaternionVector3相乘,则得到Vector3,因此只需将shootDir更改为Vector3

Vector3 shootDir = Quaternion.Euler(0, 0, angle) * Vector3.right;

第23行:

Operator * cannot be applied to operands of type 'UnityEngine.Quaternion' and 'float'

您不能将Quaternionfloat相乘,但由于shootDir现在是Vector3,因此与float相乘不再是问题。