게임 내부에서 프로그래밍 할 수있는 기술은 무엇입니까?


27

플레이어가 게임 내에서 스크립트를 작성 / 작성할 수있는 일부 게임이 있습니다 (예 : 우주 엔지니어 또는 Psi) .

둘 중 하나와 비슷한 것을 사용하고 싶지만 정보를 찾기가 어려워서 내 질문은 다음과 같습니다.

사용자가 만든 새 코드를 실행하기 위해 컴파일 된 소프트웨어의 기능을 다루는 프로그래밍 분기가 있습니까?

프로그래밍의 지점이란 PTG (Procedural Terrain Generation)와 같은 것을 의미합니다.

질문 이나 의견에 근거한 너무 많은 것을 피하기 위해, 내가 가이드 나 배울 곳을 찾고 있지 않다는 것을 분명히 밝히고, 관련된 기술의 이름이나 정의 (있는 경우)를 원합니다.


22
아마도 "통역가를 작성하는 것"입니까?
MatthewRock

2
최근에 비슷한 질문에 대답하여 " 가상 머신 "을 사용자 코드를 실행하는 시스템의 용어로 설명하고 바이트 코드 패턴에 대한 게임 프로그래밍 패턴 기사를 기존 인터프리터보다 빠르게 구현하는 수단으로 참조했습니다 .
DMGregory

3
보통 "스크립팅"이라고합니다. 게임에서 스크립팅을 구현하는 방법과 다양한 (다양한) 오픈 소스 샘플 및 실제 코드에 대한 많은 자료를 찾을 수 있습니다. 더 넓은 범위에는 컴파일러 프로그래밍의 전 분야가 있습니다 (렉싱, 파싱, 컴파일, 링크, 해석 등). 가장 넓은 범위 (필수는 아님)에서 이것은 응용 프로그램과 거의 모든 사용자 상호 작용을 수반합니다. 스크립팅 엔진은 실제로 메뉴에서 선택하는 훨씬 더 복잡한 방법입니다.
Luaan

2
파이썬 프로그램은 파이썬 스크립트를 호스팅 할 수 있습니다. 이를 메타 프로그래밍이라고합니다. 대부분의 통역 언어가 있습니다.
user6245072

1
우주 엔지니어의 AFAIK에서 코드는 샌드 박스 환경에서 C # 코드로 컴파일됩니다 (게임은 오픈 소스로 진행되었으므로 온라인으로 작동하는 방식을 확인할 수 있습니다 : github.com/KeenSoftwareHouse/SpaceEngineers ). 기본적으로 게임은 C # 컴파일러와 함께 제공되며 코드는 게임의 API 함수에만 액세스 할 수 있으므로 프로그램의 범위는 귀하에게만 제한됩니다. 그리고 멀티 플레이어를 플레이하는 경우 코드는 컴퓨터에서만 실행됩니다 (다른 플레이어 / 서버는 게임 내 결과 만 보임)
Florian Castellane

답변:


42

작성 스크립트 , 스크립트 / 임베디드 / 해석 언어 등 "루아", "리스프"또는 "AngelScript"(그대로 자세한 내용은 여기 ) 게임을하는 동안 업데이트 할 수 있습니다 [*] 후 즉시 (= 실행) 해석됩니다.

해당 스크립트의 요소를 네이티브 컴파일 된 코딩 (C ++ 등)에 바인딩하면 스크립트가 응용 프로그램에서 논리를 실행할 수 있습니다. 예 : 사용자가 스크립트에 넣을 수있는 특정 명령으로 게임 내 캐릭터가 게임 세계에서 지정된 거리만큼 이동합니다.

관련된 몇 가지 관련 질문 :


[*] 게임 플레이의 일부로 사용자에 의해 또는 응용 프로그램을 다시 시작하지 않고 빠른 반복 / 테스트를위한 개발자에 의해


14
"해석 된 언어"를 부를 때주의해야합니다. 기껏해야 논쟁의 여지가 있습니다.
wondra

1
Computercraft (minecraft mod)는 LUA를 스크립트 언어로 사용하여 게임 내 작업을 프로그래밍합니다.
Tikeb

20
나는 소란을 정말로 이해하지 못한다. 리스프는 해석되고 컴파일 될 수 있습니다. 우리는 언어를 분류하는 방법과 interpreted좋은 clasisfication 인지 여부를 논의하기 위해 여기에 있지 않습니다 . 우리는 OP에게 언어가 컴파일 될 필요는 없지만 해석 될 수 있다는 사실을 모르는 사람에게 말하고 있으며, 일부 언어를 예로 들어 설명합니다. Lisp가 해석됩니까? 예. 컴파일 되었습니까? 또한 그렇습니다! 그러나 그것은 범위를 벗어납니다. 대답은 말로 정확하지 않을 수 있지만 목적에 맞습니다. 그것은 올바른 방향으로 OP를 푸시하고 그것이 중요합니다. 여기, 내 +1을 가져 가라.
MatthewRock

1
언어가 컴파일 전용 인 경우에도 IDE, 컴파일러 및 런타임을 게임에 포함시키지 못하게하는 요인은 무엇입니까? 예산을 제외하고는
Ordous

3
@DanielJour 이론적 으로 언어가 구현과 구별 될 수 있다는 데 동의하지만 (VM의 경우 바이트 코드로 컴파일 된 머신 코드로 컴파일 됨) C가 달리 지정되지 않는 한 C가 컴파일된다는 가정은 여전히 ​​유용합니다. "매번 대기, C 컴파일 또는 C 해석?" OP의 목적을 위해, 그는 해석을 지원하는 언어를 조사해야한다. 그들이 컴파일 할 수 있는지 여부는 문제가 아니기 때문에 사용하지 않을 것입니다.
Blackhawk

12

임베디드 언어 는 적절한 기술 용어입니다. 실제로는 게임과 같은 다른 응용 프로그램 내에서 사용되는 언어는 일상적인 작업을 자동화하기 위해 반드시 해석되거나 사용되는 것은 아니지만 스크립팅 또는 해석 된 언어 라고도 합니다. 인터넷 검색 "게임용 언어 언어"는 아마도 "내장 언어"를 검색하는 것보다 더 유용한 결과를 낳을 것입니다.


11

코드를 일부 작업으로 변경하는 방법을 찾고 있습니다. 이것이 바로 통역사 가하는 일입니다.

파이썬을 살펴보십시오. 당신은 그것을 실행하고 bam! 당신은에 착륙 REPL ( R EAD EP RINT L의 OOP를).

"Hello, world"를 인쇄하는 "hello"함수를 정의합니다. 그리고 당신은 그것을 가지고 있습니다!

아무것도 컴파일하지 않았다는 것에 주목하십시오. 인터프리터는 (런타임 동안) 즉시 함수를 생성하기 위해 약간의 마법을 수행했으며 이제는 호출 할 수 있습니다.

게임에도 동일하게 적용됩니다. REPL 대신 REPL 모듈이있는 게임이 있습니다. 게임은 아마도 REPL을 시작한 다음이 REPL의 다른 모든 것을 실행하므로 데이터에 액세스하여 적극적으로 수정할 수 있습니다.

C ++과 같은 거대한 언어로 작업하는 경우 동적이 아니며 컴파일되는 경향이 있습니다. 좀 더 쉬워 자신의 언어를 만들거나 CoffeScript, Squirrel, Lua, Scheme 등과 같은 기존 언어를 사용하십시오.

스크립트 언어 를 사용하여 다른 언어 (예 : C ++)로 개발 된 게임 엔진을 기반으로하는 스크립트 를 작성하기 때문에 이를 스크립팅 언어 라고 합니다 .


2

게임 내 프로그래밍 언어가 게임 목적으로 만 설계된 경우 도메인 특정 언어 입니다.

도메인 특정 언어의 장점 (및 단점)은 언어 자체가 사용자가 수행 할 수있는 작업을 제한 할 수 있다는 것입니다 (즉, 인터넷 연결을 허용하지 않을 수 있음). 일반적인 언어보다 일반적인 게임 작업을보다 쉽게하는 언어를 디자인 할 수 있습니다. 단점은 사용자가 새로운 언어를 배워야한다는 것입니다.

게임 내에서 일반화되지 않은 사용자 코드 (예 : 파이썬 또는 펄) 위생 화되지 않은 사용자 코드를 실행 하면 사용자가 엉망이되어서는 안되는 것을 엉망으로 만들 수 있습니다. 그러나 그것은 당신의 게임에 달려 있습니다. 사용자가 게임 내에서 새 창을 여는 것과 같은 일을하거나 다른 것을 좋아하지 않으면 범용 언어를 사용하여 게임 세계의 특정 기능에 바인딩 할 수 있습니다.


1

머리 꼭대기에서 생각할 수있는 두 가지 예가 있습니다. 둘 다 당신이 요구하는 것을 정확하게하는 것처럼 보입니다.

첫 번째는 screeps입니다. https://screeps.com/ http://support.screeps.com/hc/en-us/articles/205960931-Server-side-architecture-overview 에서이 목표를 달성하는 방법에 대한 많은 정보를 읽을 수 있습니다 .

두 번째는 ComputerCraft입니다. http://www.computercraft.info/ 작동 방식에 대해 자세히 설명하지는 않지만 wiki http://www.computercraft.info/wiki/Main_Page 에서 조금 볼 수 있습니다 .

본질적으로 메인 게임은 별도의 스레드에서 인터프리터를 실행 한 다음 해당 스레드가 API 호출을 통해 게임 세계를 조작 할 수 있도록합니다.

두 예에서 언어는 거의 무제한이지만 (보안상의 이유로 일부 호출 만 차단됨) 조작은 API 호출로 제한됩니다.

일반적으로 이와 같은 작업을 시작하려면 약간의 작업이 필요합니다. 당신은 필요

  • 게임의 루프를 보호하는 스레드 관리자 (스레드가 루프를 잠 그거나 많은 리소스를 소비하지 않도록 함) 두 예제 모두 시간 기반 리미터를 사용합니다.
  • 언어를 운영하는 통역사. LUA는 요즘 꽤 일반적입니다.
  • 게임 세계를 수정하는 API 호출 세트. 프로그래밍 언어로 할 수 없다면 프로그래밍 언어가 얼마나 재미 있습니까?
  • 자원 관리 구현. 즉, 코드 파일을 저장하고 게임에서 참조하는 방법입니다.

이러한 모든 문제를 처리하는 단일 프로그래밍 분기는 없습니다. 그러나 멀티 스레딩에 대한 강력한 기반과 통역사가 작동하는 방법에 대한 일반적인 지식이 필요합니다.


0

컴파일 된 실행 파일에는 외부 프로그램 코드 를 읽을 수 있는 구문 분석기 가 포함되어 있어야합니다 . 프로그램 코드는 C 나 Python 또는 xyz처럼 보일 필요는 없습니다. 문제의 목적에 적합한 설명 데이터가 될 수 있습니다. 예를 들어 스웨덴어 또는 모스.

외부 프로그램 코드에는 구문 이 있어야 구문 분석기가 문자별로 읽을 때이를 이해할 수 있습니다. 구문은 식별자, 숫자 값, 연산자 등을 설명 할 수 있으며 코드에 포함될 수 있습니다 .

파서는 고정되어 (컴파일 된) 유연한 외부 코드에서 작동합니다.

컴파일 된 실행 파일에는 관련 기능에 대한 내부 API 가 있어야합니다 . 파서는 작업을 수행 할 수 있습니다. 실행 파일의 내부 데이터에 대한 (양방향) 액세스 권한이 있거나 구문 분석기가 일종의 데이터 저장 및 하우스 키핑을 제공해야합니다.

파서는 실행 파일이 시작될 때 외부 프로그램 코드를 읽거나 ad hoc을 읽거나 (일부) 읽 거나 각 프레임마다 다시 읽 거나 (비효율적) 코드를 직접 입력 하거나 준비되면 파서에 게시됩니다 (예 : "단위 X 앞으로 5 단계 이동"[enter]).

기본적으로 외부 코드는 고정되어 있지 않습니다. 매년, 일 또는 분마다 변경 될 수 있지만 여전히 실행 파일을 다시 컴파일 할 필요는 없습니다. 실행 파일에서 호스팅하는 결과 동작 만 변경됩니다.

당신이 지금 읽고있는 텍스트는 다음 문장이 무엇인지 알지 못하고 읽을 때 뇌에서 그것을 "실행"하기 때문에 (종종 말하면 훨씬 더) 해석 됩니다. 지금). 스택 오버플로 (사전) 전체 스토리를 두뇌의 바이트 코드로 컴파일하는 것과는 달리 실행하면 더 이상 변경되지 않습니다.

진행 phenomen는 interpretion입니다. 스크립팅은 설명을 작성하거나 작성 하는 행위 일뿐 입니다. 모든 컴퓨터 코딩은 imo 스크립팅입니다. 우리는 우리가 원하는 것을 설명합니다. "스크립트"라는 단어는 다소 기울어졌지만 괜찮습니다. 우리는 우리가 무엇을 의미하는지 압니다.

통역 된 언어에는 특별한 것이 없으며 결코 논쟁의 여지가 없습니다 . 그들 중 다수가 존재하며, 가장 오래된 것들 중 일부는 컴파일되는 것과 반대로 해석됩니다. 해석 된 언어에서는 예를 들어 직접 입력 할 수 있습니다.

sock = Socket.New (AddressFamily.InterNetwork, SocketType.Stream ProtocolType.Tcp) [ENTER]

... 그런 다음 30 분 동안 가십시오. 45 분의 커피 휴식 시간 :-). 돌아 왔을 때, "양말"이 존재하며 더 직접 입력하거나 통역사의 자동화를 계속해서 사용함으로써 추가로 사용할 수 있습니다.


해석되는 언어가 느려 야한다는 일반적인 오해가 있습니다. 그것은 사실이 아닙니다. 이 논의를 의견에 비해 너무 광범위하게 만드는 다양한 요인에 따라 해석 언어는 속도가 빠르거나 느리거나 일부 작업의 경우 빠른 것으로 간주되는 제어 언어 (보통 C)보다 느리거나 느릴 수 있습니다. socket이있는 예제는 아마도 C에서와 비슷하거나 덜 작동 할 것이므로 예제가 잘못되었습니다. 런타임에 컴파일 된 함수를 일부 언어로 재정의 할 수도 있으며 해석이 단순히 "한 번에 하나의 명령을 실행"을 의미하는 것은 아닙니다.
MatthewRock

물론, 인터프리터의 자동화에 따라 해석되는 언어가 더 빠르게 수행 될 수 있습니다. 모든 바이트 코드가 실행 된 후에는 실행이 훨씬 더 최적화 될 수 있습니다. 또한 일부 인터프리터는 코드에서 코드의 일부를 바이트 코드로 컴파일 (및 실행) 할 수 있습니다. 예는 "한 번에 하나의 명령으로 이동"이라는 자유의 예일 뿐입니 까? 글쎄요, 그것은 미래의 코드가 융통성이있는 반면에 지나치게 단순화 된 것입니다.
Stormwind

"스크립트"를 영화 스크립트처럼 생각하십시오. 여전히 배우가 필요합니다. 배우는 극장 과학이 아니라 생물학과 사회학 측면에서 직접 정의됩니다. 그 목적에 적합하지만 다른 것은 아니다 :)
rackandboneman
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.