2012-11-23 4 views
2

나는 C 번호에 unityscript에서 코드의 간단한 조각을 변환 (이해)하기 위해 노력하고있어 : 전체 코드는 여기에서 찾을 수 있습니다유니티 C# 배열 타입 에러 (unityscript에서 변환 할 때)

private var actionList = new Array();               

function Start() 
{ 
actionList = new Array(12); 

for(i=0; i<actionList.length; i++) 
    actionList[i] = new Array(4); 
for(i=0; i<actionList.length; i++) 
{ 
    actionList[i][1] = Rect(50+(i*55),50, 50, 50);   
    actionList[i][2] = new Array("action");  
} 
actionList[0][3] = KeyCode.Alpha1; 
actionList[1][3] = KeyCode.Alpha2; 
actionList[2][3] = KeyCode.Alpha3; 
actionList[3][3] = KeyCode.Alpha4; 
actionList[4][3] = KeyCode.Alpha5; 
actionList[5][3] = KeyCode.Alpha6; 
actionList[6][3] = KeyCode.Alpha7; 
actionList[7][3] = KeyCode.Alpha8; 
actionList[8][3] = KeyCode.Alpha9; 
actionList[9][3] = KeyCode.Alpha0; 
actionList[10][3] = KeyCode.Minus; 
actionList[11][3] = KeyCode.Equals; 
} 

function OnGUI() 
{ 
for(i=0; i<actionList.length; i++) 
    { 
    if(actionList[i][1] != null) 
     drawButton(actionList[i][1]); 
    } 
} 

function drawButton(rect) 
{ 
    GUI.Button(rect, "Hello"); 
} 

: Creating a Drag and Drop Spell Bar

C#에서이에서 내 촬영합니다 (keymappings 밖으로 떠나) :

using UnityEngine; 
using System.Collections.Generic; 

public class SpellBar : MonoBehaviour 
{ 
private object[][] actionList; 

void Start() 
{ 
actionList = new object[12][]; 

for (int i=0; i<actionList.Length; i++) 
    actionList[i] = new object[4]; 
for (int i=0; i<actionList.Length; i++) 
{ 
    actionList[i][1] = new Rect(50+(i*55), 50, 50, 50); 
} 

//Keymappings 
} 

void OnGUI() 
{ 
for(int i=0; i<actionList.Length; i++) 
    { 
    if(actionList[i][1] != null) 
     DrawButton(actionList[i][1]); 
    } 
} 

void DrawButton(Rect rect) 
{ 
    GUI.Button(rect,"Hello"); 
} 
} 

내가 이곳에 오기 오류 OnGui에, DrawButton을 사용 (ACTIONLIST,). 오류 : '개체 식'을 "UnityEngine, Rect"유형으로 변환 할 수 없습니다.

유니티 스크립트 나 C#에서 숙련 된 프로그래머가 아닙니다. 수 시간 동안 Google을 검색하여 Lists, ArrayLists 등을 시도했지만 솔루션을 찾을 수 없습니다. . 사전에 Thnx를 입력하십시오.

EDIT 27-11-2012
그래서 새로운 관련 문제가 발생했습니다.이 항목을 여기에서 편집해야할지 모르겠지만 답장에서 제대로 형식을 지정할 수 없습니다.
변환하려고하는 JavaScript 코드에서 다음 코드는 배열에 클래스를 저장하는 데 사용됩니다.

이것이 정확히 원하는 방식은 아니지만 배열에 메서드를 저장할 수 있기를 원하지만 C#으로이 메서드를 찾을 수는 없습니다. 그것은 단순히 불가능한가요?
(예) 나는 이런 식으로 뭔가를 할 노력하고있어 : 자바 스크립트와는 달리

//In addition to what I posted above 
void Start() 
{ 
actionList[i][0] = void FireBall(); 
} 

void FireBall() 
{ 
Texture2D icon = Resources.Load("icon_fireball") as Texture2D; 
String description = new String("Shoot a ball of fire"); 

//etc 
} 
+1

그건 자바가 아니에요. Javascript 일 수도 있지만 자바가 아닙니다. –

+0

사람들이 "Java"와 "Javascript"를 혼동하는 것을 듣고 나는 움츠 리다. 피상적 유사점이 있지만 가장 중요한 측면에서 "Java"와 "Javascript"는 별개입니다. 게시물을 편집하고 제목을 "Javascript"로 변경했습니다. – paulsm4

+0

Thnx, 자바 스크립트를 자바 스크립트로 편집했습니다. 여기 N00b – downdf

답변

1

는 C#을 당신이 Rectangle을 요청하는 방법에 object을 통과 할 수있는 의미, 강한 타입이다. 정확한 유형 또는 해당 유형에서 파생 된 하위 메소드를 제공해야합니다.

그래서,

private object[][] actionList; 

당신이

private Rectangle[][] actionList; 

강한 형 언어가 있어야 대신 당신이에 잘못된 변수 유형을 통과하지 있는지 확인하기 위해 컴파일시의 검증을 많이 수행 메서드 매개 변수가 잘못되었습니다. 장점은 두 가지입니다. 먼저 변수가 올바른 유형인지 알아보기 위해 런타임에 테스트를 수행 할 필요가 없습니다. 둘째, 모든 부분을 실행할 필요없이 코드에서 오류를 쉽게 찾을 수 있습니다. 컴파일하면 이미 80 % 완료되었습니다.

그러나 배열에서 다른 유형을 결합하려는 경우 여러 선택 항목이 있습니다. 당신은 일치 유형이없는 개체의 집합을 결합하는 Tuple<> 같은 클래스를 사용하거나 같은 방법으로 공급하기 전에 Rectangleobject 캐스트 할 수 있습니다 캐스트가 무효 인 경우,

DrawButton((Rectangle)actionList[i][1]); 

그러나 , 당신은 런타임 어설 션을 얻을 것이다.

+0

빠른 답장을위한 Thnx! Unity에서 튜플 <>에 대한 문서를 실제로 찾을 수 없었습니다 (구현 방법을 알지 못함). 그러나 사각형으로 캐스팅하는 것이 효과적입니다. 그것에가는 것이 옳지 않다고 말씀 하시겠습니까? 그렇다면 객체 배열 대신 무엇을 제안 하시겠습니까? Thnx again – downdf

+0

@downdf :'Tuple <>'은 Unity 클래스가 아니며 .NET 4+ 클래스이지만 본질적으로 객체의 수만큼의 일반적인 래퍼 일뿐입니다. 예를 들어, 여러분은 항상 Rectangle과 이름을위한 문자열을 가지고 있다고 가정 해 봅시다. 'List >'을 할 수 있습니다. 따라서 string과 Rectangle의 콤보가 항상 포함 된 목록입니다. http://msdn.microsoft.com/en-us/library/system.tuple(v=vs.100).aspx 캐스팅없이 관리 할 수있는 가장 좋은 방법은 약간의 런타임 비용이 필요하므로 일반적으로 코드가 무엇인지 아는 것처럼 쉽게 읽을 수 있습니다. 그러나 당신이 캐스트와 함께 그것을 좋아한다면, 그것도 좋습니다. – LightStriker

+0

나는 관련 문제 (희망 사항이 여기에있는 방식으로 이루어지기를 바랍니다)로 OP를 편집했고, 당신이 그것을 볼 수 있다면 고맙겠습니다. 건배! – downdf