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;
}
}
}
我仍然是这个脚本的新手,仍然不熟悉数据类型。我希望你能帮助我。谢谢!
我在工作中多次遇到这种情况,并大量使用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
变量,而编译器同样无法处理此问题。
如果将Quaternion
与Vector3
相乘,则得到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'
您不能将Quaternion
与float
相乘,但由于shootDir
现在是Vector3
,因此与float
相乘不再是问题。