Q100385: 사용자 작업에 따라 사용자 지정 기능을 추가하기 위해 Python을 사용하여 Katana 에 콜백 및 이벤트 처리기를 등록하는 방법

팔로우

요약

이 문서에서는 Katana 에서 콜백 또는 이벤트 핸들러를 등록하는 방법을 설명하고 사용 가능한 콜백 및 이벤트 유형에 대한 정보를 찾을 수 있는 위치와 해당 콜백 함수에 대해 예상되는 입력 인수에 대해 자세히 설명합니다.
콜백 및 이벤트에 대한 문서는 Katana 개발자 가이드 에서도 찾을 수 있습니다. 아래 기사에서는 구현 방법에 대한 몇 가지 실제 예를 제공합니다.

추가 정보

콜백은 Katana 에서 다양한 이벤트(예: 노드 생성 또는 스크립트 로드)가 발생할 때 자동으로 실행되는 Katana 환경에 추가된 Python 코드입니다.

이벤트는 마우스 클릭, 키 누르기 등 사용자 동작이나 다른 소스의 결과로 발생하는 동작입니다. 이벤트 핸들러는 이벤트를 처리하는 데 사용되는 루틴으로, 프로그래머는 이벤트가 발생할 때 실행될 코드를 작성할 수 있습니다.

콜백은 특정 상황(예: 파일을 저장하기 직전)에서 Katana 에 의해 트리거되며 호출 코드는 계속하기 전에 콜백이 실행될 때까지 기다립니다. 예를 들어 사용자는 프로젝트를 저장하기 전에 수정할 수 있습니다.

반대로, 이벤트는 Katana 의 이벤트 시스템에 의해 대기열에 추가되고 "나중에" 처리됩니다. 이는 콜백이 더 즉각적이지만 일반적으로 매우 빨라야 함을 의미합니다. 그렇지 않으면 작업하는 동안 UI가 정지될 위험이 있습니다.

콜백과 이벤트 핸들러는 모두 새로운 Katana 프로젝트를 생성할 때 프로젝트 설정을 변경하거나 특정 노드 매개변수의 값 변경에 반응하는 등 다양한 상황에서 유용합니다.

콜백

Katana 에서는 소프트웨어 시작, Katana 프로젝트 로드 중, 노드 생성 등 다양한 상황에서 콜백을 사용할 수 있습니다. 사용 가능한 콜백의 전체 목록을 보려면 Python 탭에서 다음 코드를 실행하세요.

from Katana import Callbacks
print(dir(Callbacks.Type))


각 콜백 유형에 전달되는 키워드 인수를 확인하려면 호출 시 입력 인수를 인쇄하는 다음 콜백을 등록하면 됩니다.

def Hello(**kwargs):
for i in kwargs.keys():
print(i)


이러한 인수는 콜백 함수 내에서 다음과 같이 액세스할 수 있습니다.

def Hello(**kwargs):
   print(kwargs.get('filename'))

from Katana import Callbacks Callbacks.addCallback(Callbacks.Type.onSceneLoad, Hello)

이벤트 핸들러

Katana 에는 등록된 핸들러가 수신할 수 있는 다양한 이벤트 유형이 있습니다. 사용 가능한 모든 이벤트 유형 목록을 보려면 Python 탭에서 다음을 실행하십시오.

 from Katana import Utils
print ( sorted ( Utils . EventModule . GetAllRegisteredEventTypes ()))

각 이벤트 유형에 대해 어떤 입력 인수가 있는지 찾으려면 특정 이벤트에 대해 다음 핸들러를 등록하면 됩니다. 이벤트가 트리거되면 핸들러는 인수를 인쇄합니다. 다음은 "node_create" 이벤트 유형에 대한 입력 인수를 인쇄하는 예입니다.

def node_CreateCallback(eventType, eventID, **kwargs):
    for i in kwargs.keys():
        print(i)

Utils.EventModule.RegisterEventHandler(node_CreateCallback, 'node_create')


입력 인수가 알려지면 이벤트 핸들러 함수 내에서 사용할 수 있습니다. 다음은 사용자 기본 설정의 변경 사항을 수신하기 위해 등록할 수 있고 기본 설정의 이름과 새 값을 출력하는 예제 이벤트 핸들러입니다.

def PrefChangedCallback(eventType, eventID, prefKey, prefValue):
    print(prefKey, "preference changed to:", prefValue)

Utils.EventModule.RegisterEventHandler(PrefChangedCallback, 'pref_changed')

노드 매개변수 변경에 대한 이벤트 핸들러

예를 들어 이벤트 핸들러 함수가 특정 노드 매개변수의 변경에만 반응해야 하는 경우 ' parameter_finalizeValue ' 이벤트를 수신하도록 등록할 수 있습니다. 변경된 매개변수의 이름은 핸들러 함수 내에서 확인하여 관련 항목인지 확인할 수 있습니다.

def myParamCallback(eventType, eventID, node, param):
    if (node.getName() == "CameraCreate") and (param.getName() == 'fov'):
        print("FOV for the following camera changed to " + repr(param.getValue(0)) + ": " + node.getParameter('name').getValue(0))

Utils.EventModule.RegisterEventHandler(myParamCallback, "parameter_finalizeValue")

이벤트 핸들러는 이벤트가 대기열에 추가된 직후에 반드시 실행될 필요는 없습니다. 코드가 처리된 특정 이벤트와 실행된 이벤트 핸들러에 의존하는 경우 다음을 호출해야 할 수 있습니다.

Utils.EventModule.ProcessAllEvents() 


콜백 및 이벤트 처리기에 대한 자세한 내용은 Katana 개발자 가이드의 콜백 및 이벤트 섹션을 참조하세요.

Katana 시작 시 콜백 또는 이벤트 핸들러 등록

Katana 시작될 때 콜백 또는 이벤트 핸들러는 다음과 같이 자동으로 등록될 수 있습니다.

  • 콜백 또는 이벤트 핸들러 함수가 단일 Python 함수에서 수행할 모든 작업을 정의하고 아래 예제 코드에 설명된 대로 이를 등록합니다.
from Katana import Utils, Callbacks

def PrefChangedCallback(eventType, eventID, prefKey, prefValue):
    print(prefKey, "preference changed to:", prefValue)

Utils.EventModule.RegisterEventHandler(PrefChangedCallback, 'pref_changed')
def Hello(**kwargs): print(kwargs.get('filename'))
Callbacks.addCallback(Callbacks.Type.onSceneLoad, Hello) 

  • 이를 복사하여 텍스트 편집기에 붙여넣고 파일을 저장합니다.

  • 파일 이름을 init.py로 바꾸고 파일 확장자가 파일 브라우저에 표시되는지 확인합니다. 이는 파일 확장자가 .txt 또는 다른 파일이 아닌 .py인지 확인하기 위한 것입니다.

  • 파일을 .katana 폴더 또는 $KATANA_RESOURCES 환경 변수에 정의된 경로 아래의 시작 폴더에 배치합니다.


KATANA _RESOURCES 에 대한 자세한 내용은 Katana 설치 가이드 의 해당 항목을 참조하세요.

다음에 Katana 시작되면 지정된 작업이 발생할 때 콜백 함수가 실행되고 관련 이벤트가 대기 및 처리될 때 이벤트 핸들러 함수가 실행됩니다. 위의 예에서는 기본 설정이 변경되거나 Katana 프로젝트가 로드되면 새 기본 설정 값 또는 프로젝트 파일 경로가 각각 터미널에 인쇄됩니다.

추가 도움말

콜백 및 이벤트 처리기에 대한 자세한 내용은 Katana 개발자 가이드의 콜백 및 이벤트 섹션을 참조하세요.

콜백이나 이벤트 핸들러를 설정하는 데 문제가 발생하는 경우 지원 티켓을 열고 지금까지 수행한 문제 및 문제 해결 단계에 대해 알려주십시오.


지원 티켓을 여는 방법에 대한 자세한 내용은 Q100064: 지원 티켓을 올리는 방법을 참조하세요.

    우리는 문제로 불편을 끼쳐 드려 죄송합니다

    이유를 알려주세요