중화사전망 - 자전 검색 - Unity3d 에서 JavaScript 를 작성하는 방법
Unity3d 에서 JavaScript 를 작성하는 방법
0. 기본 개념:
Unity3d 의 스크립트는 게임 오브젝트에 연결하고, 변수 값을 수정할 수 있으며, 스크립트 수정 게임 효과를 실시간으로 미리 볼 수 있어 스크립트 조정 및 디버깅에 많은 시간을 절약하고 개발 효율성을 높일 수 있습니다.
Unity 의 간단한 프로젝트와 많은 샘플 및 스크립트 리소스 키트가 JS 에 있습니다. 상업 프로젝트는 기본적으로 C# 을 사용합니다. C# 과 C/C++ 는 상호 작용이 쉽고, 풍부한 데이터 구조와 객체 지향 아키텍처는 대규모 프로그램 작성에 도움이 되며, 많은 강력한 타사 플러그인은 C# 을 사용하여 개발되어 워크플로우를 용이하게 합니다.
컴파일 프로세스:
Unity 스크립트 런타임 환경에서는 Mono 를 사용합니다. 그물 프레임 워크. 실제로 Unity 스크립트는 Mono 가상 시스템에서 실행되고 원가기 코드를 컴파일하는 언어인 Boo 를 사용하여 구현됩니다. Mono 는 문자열 및 수학 라이브러리와 같은 Javas 스크립트의 많은 일반적인 운영 환경을 제공합니다. 또한 UNITY 스크립트의 중국어 프랑스어 이름이 Mono 의 이름과 같아야 하기 때문에 대문자여야 하는 이유를 알 수 있습니다.
Unity 의 스크립트는 기존 JIT 해석 언어와 다르며 둘 다 컴파일해야 하므로 속도가 같습니다.
이 세 가지 언어의 코드는 결국 컴파일되고 실행되며 스크립트는 서로 액세스할 수 있습니다.
라이브러리 호출:
Unity 스크립트는 Mono 에서 실행됩니다. 그물 플랫폼, 모든 스크립트를 사용할 수 있습니다. Xml, 데이터베이스 및 정규식에 적합한 솔루션을 제공하는 net 라이브러리입니다.
Unity 의 Js 는 mono 에게 전화하고 싶다. 그물 라이브러리, 직접 가져오면 됩니다.
수입 시스템
시스템을 가져옵니다. Io;
그렇지 않으면 지정된 전체 네임스페이스를 사용하여 System 과 같은 함수를 호출합니다. IO.File.Open () 은 File 이 아닙니다. 열기 ().
1. 기본 유형 및 설명:
1) 데이터 형식:
숫자 유형: char, byte, sbyteshort, ushort, int, uint, long, ulong 부동, 배정도; 십진법.
부울 값: 부울 값
문자열: 문자열, [색인] 기호입니다.
문자열 [0] 은 0 으로 표시된 문자를 뺀 문자열입니다.
Var s: string = "what _ it _ may _ be";
S = s.replace ("_" [0], "[0]); //모든 밑줄을 공백으로 대체합니다
2) 변수 선언:
변수는 먼저 [must] 로 선언해야 합니다 (컴파일상의 이유로 선언 유형은 너무 많은 상수를 줄이고 메모리 누수를 방지하는 데 도움이 됨). [optional] 유형을 정의할 수 있습니다.
Varplayername: string;
함수의 매개 변수도 유형을 선언해야 합니다.
기능 테스트 (playerName:String, baseInfo:Object)
{
}
선언 시 유형을 정의하거나 지정한 경우 선언 시 유형을 정의하지 않으면 유형을 다시 변경할 수 없습니다.
Var a= "테스트";
A = 5;; //오류가 보고되었습니다
Var a;;
A = "테스트";
A = 5;; //맞습니다
변수는 public, protected, private 로 수정할 수 있습니다. 쓰지 않으면 기본값은 public 이며 검사기 뷰에서 public 의 변수를 보고 편집할 수 있습니다.
3) 어레이:
내장형 맞춤형 어레이 (빠르고 단순함):
Var 값: int [] = {1,2,3};
Convert to Array 배열 (배열을 처리해야 함), var arr = 새 배열 (values);
배열 객체 배열 (느린 동적 증가 정렬 및 병합 기능):
Var arr = new array (); 에서 ... 푸시 ("좋은") 적응;
내장 배열로 변환 (고성능이 필요한 경우), varbarray: int [] = arr. To build in (int);
4) 링크 목록 및 제네릭:
UnityScript 는 제네릭을 사용할 수 있으므로 동적 크기의 배열을 사용할 때는 array 대신 List 를 사용하는 것이 좋습니다. 기본적으로 배열을 사용할 이유가 없습니다. List 는 더 빠르고 기능이 풍부합니다. 혼합 유형의 배열이 필요한 경우 객체 목록을 사용할 수 있습니다. Unity 스크립트의 일반 구문은 C# 의 구문과 비슷하지만 ""가 하나 더 있습니다 기호는 "
5) 연산자 및 표현식:
C 와 함께.
6. 선언:
각 행은 세미콜론을 써야 합니다. 객체 요소를 트래버스할 때 in 에는 c 보다 for 가 더 많습니다. for (var I: int = 0; 나< 10; I++).
스위치는 문자열 변수를 사용할 수 있습니다.
2. 기능
보고 규칙:
함수 함수 이름 (매개변수 1: 매개변수 유형, 매개변수 2: 매개변수 유형 ...): 반환 값 유형입니다.
{
}
UnityScript 의 함수는 함수 유형 객체로 간주할 수 있으며 변수처럼 비교 및 값을 지정할 수 있습니다.
익명 함수는 작성할 수 없습니다.
수학은 Mathf 가 필요합니다.
클래스 (DOM js 에는 클래스가 없음):
Unity 에서 js 파일은 클래스이며 unity 엔진은 js 파일에 대한 클래스를 자동으로 생성합니다.
Unity 스크립트의 경우 unity 에서 파일을 컴파일하면 스크립트 파일 이름이 같은 클래스가 스크립트에 자동으로 추가되고 MonoBehaviour 에서 자동으로 상속됩니다. 그러나 C# 또는 Boo 의 경우 스크립트에 클래스 이름과 상속 관계를 명시적으로 작성해야 합니다. MonoBehaviour 에서 상속되지 않는 클래스를 만들려면 C# 언어를 사용하거나 외부에서 js 스크립트 리소스를 추가합니다. 새 객체를 직접 만들 수 있습니다.
//SayHello.js
#pragma strict // 가능한 한 빨리 오류를 생성하고, 동적 유형을 비활성화하고, 정적 유형 (강력한 유형) 을 적용하는 엄격한 유형 감지.
함수 sayHello ()
{
}
C# 에 해당:
# 엄격한 잡주
공공 클래스 SayHello 는 MonoBehaviour 를 확장합니다
{
함수 sayHello ()
{
}
}
그러나 동일한 파일에 여러 클래스를 선언할 수 있습니다. 이 기능은 일반적으로 MonoBehaviour 에서 상속되지 않는 일부 보조 클래스를 사용해야 하는 경우에 특히 유용합니다.
예를 들면
클래스 버튼 상태 {
Var currentState:int;;
Var 간격띄우기: 벡터 2;
}
파일에 MonoBehaviour 의 하위 클래스를 선언했지만 클래스 이름이 파일 이름과 일치하지 않으면 대/소문자가 일치하지 않아도 문제가 발생할 수 있습니다.
Js 파일에서 비헤이비어 스크립트를 작성할 때 실제로 클래스를 작성하는 것임을 이해하는 것이 중요합니다.
A) 클래스 및 해당 객체: 파일 이름은 클래스 이름입니다. 파일 이름이 foo.js 인 경우 다른 곳에서 var x = new foo () 형식으로 호출할 수 있습니다.
B) 클래스 메서드 및 미리 정의된 메서드: 일부 특정 메서드는 Start 및 FixedUpdate 와 같이 시스템에 미리 정의된 일부 이벤트 핸들러를 구현하기 위한 것입니다. 어떤 경우든 선언된 함수는 파일이 나타내는 클래스의 메서드입니다.
C)class 속성: 파일에서 함수 정의 외부에 작성된 모든 코드는 이 클래스의 범위 내에서 실행되며 선언된 변수도 이 클래스의 멤버 변수입니다. 클래스 내의 정적 함수와 변수는 본질적으로 해당 클래스의 메서드와 속성입니다.
예:
/* 이러한 값은 동작을 게임 오브젝트 위로 드래그할 때 표시되며 편집할 수 있습니다
*/
공용 이름: 문자열
/* 객체를 참조하는 다른 스크립트 (예: 동일한 객체에 연결된 경우) 에서 공통 함수를 볼 수 있습니다
*/
Public age:int;;
/* private 멤버는 thisobject 를 참조해도 다른 스크립트에 표시되지 않습니다
*/
Private favoriteColor: 색상;
/* foo 동작의 복사본이 있는 게임 오브젝트를 이 속성으로 드래그하여 bestFriend 에 값을 할당할 수 있습니다. 이렇게 하면 bestFriend 의 공용 메소드 및 멤버에 액세스할 수 있습니다
*/
공개 절친: foo
/* Unity 는 모든 프레임에서 이 함수를 호출하므로 실제로 이벤트 처리기입니다
*/
함수 업데이트 () {
/*transform 은 비헤이비어가 연결된 게임 객체에서 상속된 속성 */
Var t = 변환;
}
기능 막대 () {
//이것은 단지 함수일 뿐, 직접 호출하지 않으면 아무 일도 하지 않는다
}
4. 유산
Unity 에 extends 키워드가 필요합니다.
MyHello 클래스는 Hello 를 확장합니다
{
}
DOM js 는 prototype 에서 bind () 메서드를 사용합니다.
Unityjs 는 가상 함수도 제공합니다.
클래스 상속도 다릅니다. JavaScript 및 C# 에서 메서드는 숨겨져 있으며 메서드 선언에 가상 키워드를 추가하지 않는 한 다시 로드할 수 없습니다. 차이점은 C# 이 오버로드 키워드 override 를 포함하는 메서드만 다시 로드한다는 것입니다. 자바스크립트에는 키워드가 필요하지 않지만 클래스 메서드를 다시 로드하여 재정의할 수 있으며 다른 모든 내용은 상속할 수 있습니다.
//Foo.js
Var foo = "안녕, 세상";
함수 doEet(){
//아무 작업도 수행하지 않고 덮어쓰도록 설계되었습니다
}
다음을 생성합니다.
//Foo.js
UnityEngine 가져오기
ClassFoo 확장 MonoBehaviour {
Public var foo = "안녕, 세상";
공용 함수 doEet(){
//아무 작업도 수행하지 않고 덮어쓰도록 설계되었습니다
}
}
하위 클래스 쓰기:
//PrintingFoo.js
클래스 PrintingFoo 확장 Foo {
함수 doEet(){
인쇄 (foo);
}
}
가상 함수를 생성하려면 다음을 수행합니다.
ClassFoo
{
가상 함수 DoSomething ()
{
디버깅. Log ("from baseclass");
}
}
//SubFoo.js
SubFoo 클래스는 Foo 를 확장합니다
{
가상 함수 DoSomething ()
{
디버깅. Log ("하위 클래스에서");
}
}
//기타 장소
Varfoo: foo = newsubfoo ();
복. Dosomething (); //printsfrom 하위 클래스
상위 클래스의 메서드를 호출하려면 키워드 super 를 사용합니다. 예를 들면 다음과 같습니다.
SubFoo 클래스는 Foo 를 확장합니다
{
가상 함수 DoSomething ()
{
정말 멋져요. Dosomething (); //은 (는) 허황된 함수가 아닙니다. 직접 호출해야 합니다. 하이퍼수식이 필요하지 않습니다.
디버깅. Log ("하위 클래스에서");
}
}
//기타 장소
Varfoo: foo = newsubfoo ();
복. Dosomething (); //"기본 클래스에서" 및 "하위 클래스에서" 인쇄
클래스 간 통신: Use-a 모드 (연관 관계) 는 상속 커플링보다 훨씬 낮기 때문에 수정 및 유지 관리가 용이합니다.
/*Foo.js */
바바: 바;
함수 Start(){
Bar = 게임 개체. Getcomponent (bar);
}
함수 doEet(){
//내 일을 하다
If(bar ){
Bar.doeet ();
}
}
/*Bar.js */
함수 doEet(){
//특별한 일을 하다
}
5. 목표
New in Unity 를 사용하여 객체를 만드는 것이 항상 가능한 것은 아닙니다 (일반 클래스는 가능, 특수 클래스는 가능, 모든 스크립트는 동일). 특수 클래스: 편집기를 사용하여 항목 뷰를 마우스 오른쪽 버튼으로 클릭하거나 Create js 또는 C# 구성 요소의 클래스는 MonoBehaviour 클래스에서 상속되며 Unity 가 해당 클래스에 대한 객체를 자동으로 만들고 오버로드 메서드를 호출하므로 이러한 유형의 클래스에 대한 객체를 만들 수 없습니다.
Unity 의 흥미로운 점은 그것의 클래스가 매우 자유로운 mixin 전략을 채택했다는 것이다. 보통 너는 네가 필요로 하는 수업을 빠르고 쉽게 찾을 수 있다. 가장 일반적인 예 중 하나는 Transform 클래스입니다. 작업 중인 객체의 경우 해당 객체에 연결된 모든 관련 클래스에서 해당 속성과 메서드를 쉽고 빠르게 얻을 수 있습니다.
예를 들어, 일반적인 작업은 객체와 연관된 Transform 클래스의 인스턴스를 나타내는 "transform" 이라는 변수에 액세스하는 것입니다. 관련 위치 좌표가 필요한 경우 Vector3 객체인 transform.position 을 방문하십시오. 게임 개체가 필요하면 transform.gameObject; 를 방문하십시오. 렌더러가 필요하면 transform.renderer 를 방문하십시오. 잠시만요. 일반적으로 한 오브젝트의 주요 속성을 알고 있으면 해당 오브젝트의 다른 모든 속성을 빠르게 얻을 수 있습니다.
6.js 와 C# 는 단방향 통신이지만 컴파일 문제로 인해 양방향 통신은 아닙니다.
Js 액세스 C# 스크립트 구성 요소:
//C# 스크립트에 액세스하는 변수를 만듭니다
Private var cs 스크립트: csharp1;
웨이크업 기능 ()
{
//CSharp 스크립트 가져오기
CsScript =this 입니다. Getcomponent ("cs harp1"); //표준 자산 폴더에' CSharp 1' 파일을 두는 것을 잊지 마십시오
}
//텍스트 및 기타 GUI 요소를 화면에 렌더링합니다
OnGUI 함수 ()
{
//csharp1'message' 변수 렌더링
GUI. 레이블 (newrect (10,30,500,20), csscript.message);
}
C# js 스크립트 구성 요소에 액세스:
UnityEngine 사용
시스템을 사용하다. 소장하다
공용 클래스 csharp 2:monobhaviour
{
//변수를 만들어 JavaScript 스크립트에 액세스합니다
Private js1jsscript;
Void Awake ()
{
//JavaScript 구성 요소 가져오기
JsScript = this 입니다. Getcomponent & ltjs1> (); //표준 자산 폴더에' JS 1' 파일을 두는 것을 잊지 마십시오
}
//텍스트 및 기타 GUI 요소를 화면에 렌더링합니다
Void OnGUI ()
{
//렌더링 js1'메시지' 변수
GUI. 레이블 (new rect (10,10,300,20), jsscript.message);
}
}
7. 타사 라이브러리 사용:
제 3 자. XML-RPC 와 같은 NET 라이브러리는 새 리소스 자산을 작성하여 도입할 수 있습니다.
8. 문제 해결
Print 함수, Log () 함수 또는 Debug 를 사용할 수 있습니다. 로그 (). 중단점을 설정하려면 Debug 를 사용합니다. Break () 함수를 사용합니다.
Print () 함수는 메시지를 생성하고 MonoBehavioour 클래스의 범위 내에서만 상태 표시줄과 콘솔에 출력합니다.
더 좋은 방법은 Debug 를 사용하는 것입니다. Log ("여기에 메시지 삽입"); 이 방법은 어디에서나 사용할 수 있다. Debug 를 사용할 수도 있습니다. 로그 경고 및 디버그 경고 및 오류 메시지를 생성합니다.
디버깅. Break (); 정확한 지점에서 게임을 일시 중지할 수 있습니다. 이 기능은 특정 감정 조건이 발생할 때 객체의 상태를 확인하려는 경우에 유용합니다.
개발 환경에서 프로젝트를 실행하면 편집 인터페이스도 완전히 실시간으로 업데이트되므로 객체 인스턴스의 내부 상태를 볼 수 있습니다.