학원에서 배운거 문서보면서 정리하는 거라서 공식문서만 보고 적는 글이 아니다. 물론 코드는 보면 알겠지만 내가 전체적으로 재구성한거다. 그래서 이론적 측면에선 매우 부족한 글이 될 것이고, 그냥 내가 필요할 때 참고하고 보충할 글이 될 것이다. 한마디로 메뉴얼에 대한 이차 메뉴얼.
0. 개괄
AngelScript는 Type, Function, Class 등을 regist 해서 외부 스크립트가 연동해서 쓸 수 있게 하는 lib 다. 아마도 동적으로 링크시키는 듯 한데 (구체적으론 잘 모르겠다.) 사용 의의는 기존 프로젝트를 다시 빌드할 필요 없이 세부적인 부분을 실시간으로 수정/실행 할 수 있다는 점이 될 것이다. 예를 들어 몬스터의 이동 함수는 이미 빌드되어 있는 상태에서 (50, 50) 지점에서 (100, 100) 지점으로 움직이게 하는 코드를 이 lib를 통해 작성하여 링크할 수 있겠다.
여기서 쓸 내용은 위에 다 올려놨다. 코드 내용은 콘솔에 글자 출력하는 메소드가 있는 클래스 AAA를 가지고, 이 메소드를 AngelScript 로 실행하는 것이다.
1. 다운로드
외부 라이브러리를 링크하기 위해서 필요한건 헤더파일, lib 파일 등이다. 구글에 대충 치면 나오는 다운로드 사이트에서 최신 버전을 받자. 그리고 project 에서 비주얼 스튜디오 쓰면 msvc17 폴더 들어가서 빌드 시켜서 나오는 lib 를 자기 프로젝트에 들고가면 된다. project/lib 에 빌드 끝다고 가보면 있을 거다.
빌드하기 전 환경 설정할 때 win64 인자 x86 인지 잘 생각해보자. 이것 때문에 시간 버렸다.
+ Add On 폴더에서 긁어 올 때, 외부 폴더에서 해서 안되면 그냥 프로젝트에 포함시키자.
2. 엔진
1.asIScriptEngine
처음 할 것은 스크립트 엔진 만들기. 그리고 사용할 자료형 등을 등록하기.
특히 얘는 std::string 클래스를 몰라서 등록 해줘야한다. 다행히도 scriptstdstring 파일로 친히 만들어져 있다. 그걸 쓰자.
SetMessageCallBack 은 에러잡기 용으로, 아래 처음 사이트 처음에 있는 걸 조금 변형해서 사용했다.
에러잡기 용으로 두번째 사이트 맨 아래에 있는 exception hanling 도 있으니 참고.
나는 AAA 만 쓰면 되서 저렇게 등록했다. 전역변수도 등록가능하고 위에건 Reference Type 인데 int, float 처럼 value Type 도 등록 가능하다. 주의사항은 shared_ptr 등이 들어간건 인식을 못하니 raw pointer 를 사용해야 한다는 것. 자세한건 아래를 보자.
2. asIScriptContext
함수를 실행할 때 필요한 것. 엔진이 이런저런 타입 등이 등록되어있어서 이런 구조인 것일까.
얘는 생성할 때 오버헤드가 있어서 만들어 놓고 돌려 써야한다.
prepare, setArgObj, setObject, Execute, GetAddressOfReturnValue, unprepare 등의 메소드를 주로 사용한다.
prepare 에서 사용할 함수 설정, Excute 에서 세팅할 함수 실행, unprepare 은 사용 종료 및 초기화가 진행된다.
3. CScriptBuilder
asScriptEngine 세팅이 완료되면 다음은 스크립트를 가져올 차례이다. 이는 3줄로 끝난다.
CScriptBuilder 는 as 확장자를 가진 우리가 작성한 스크립트를 컴파일 하는 얘다. 얘로 컴파일 하면 끝.
정확히는 CScriptBuilder 가 Module 을 만드는 것인데, Builder 당 Module 은 하나 가질 수 있어서 사용자 입장에선 구분의 필요성을 딱히 느끼지 못하겠다.
Module 에서 정의한 클래스 타입을 빼와서 asScriptEngine 에서 메소드 함수를 빼온다.
함수가 생성자의 경우 생성된 객체를 빼올 수 있으며, 이 객체를 뒤에 메소드 사용할 때 사용할 것이다. 그리고 asIScriptContext 를 통해서 스크립트에 정의된 함수를 사용한다.
빼낸 객체는 이렇게 사용할 것이다.
4. Script 문법
스크립트 내에선 포인터를 사용하지 않는다. int, float, Vector 같은 value type 이 아닌 class 등은 reference type 으로 분류되어 정의, 대입 시 @를 이름 앞에 적어야한다. 메소드나 멤버변수를 빼올 땐 쓰지 않는다.
아래는 내가 사용한 스크립트이다.
5. 요약
Engine Setting -> Type Register -> Builder Script Compiling -> asIScriptFunction Extracting -> Use
6. string
기본으로 multibyte 를 지원함. 이게 뭐냐면 char* 에 적당히 글자마다 유동적으로 크기를 배당하는 거임. 그래서 배열로 글자 하나하나 뽑아내는게 어려움. 그래서 std::string 같은 걸로 받으면 됨.
댓글 없음:
댓글 쓰기