Announcement

Collapse
No announcement yet.

언리얼 초보의 스크립트에 대한 질문입니다.

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    언리얼 초보의 스크립트에 대한 질문입니다.

    언리얼 스크립트에 대한 개념이 안잡힌거 같아서 질문을 해봅니다.


    보통 다른 언어에서는 다른 클래스에 있는 함수를 불러오기 위해 include로 참조하여 변수를 만들어 사용하는데

    언리얼에서는 어떻게 하는지 궁굼합니다.


    예로 제가 하고있는 프로젝트에서는 MyPawn 이라는 pawn 클래스를 만들고 여기서 GroundSpeed를 기본으로 400값을 주었습니다.

    그리고 함수를 만들어서 그 함수가 호출되면 GroundSpeed를 800으로 올리려고 하는데

    다른 클래스에서 var MyPawn MyP; 이렇게 만들고 MyP.SpeedUp(); 이렇게 하면 아무것도 안되더군요..(SpeedUp이 800으로 올리는 함수)

    그리고 이게 된다면 키즈멧에서 트리거에 연결하여 캐릭터가 트리거에 충돌하면 SpeedUp이라는 함수를 호출하고 싶은데

    이것도 어떻게 해야 할지 모르겠더군요...


    다른 카페나 블로그에서 참고하여 foreach AllActors나 exec function으로 만들어서 console command로 불러온다거나
    다른 것들을 사용하라고 봤는데 어떻게 사용해야 할지 몰라서요..
    자세한 답변 부탁드립니다..

    #2
    DefaultEngine.ini 에 배열된 언리얼 스크립트 패키지 순서대로 컴파일을 합니다.

    즉, 하위에 배열된 패키지들은 상위에 배열된 패키지의 스크립트를 모두 인클루드한다고 표현할 수 있습니다.

    그러므로 클래스 파일에 따로 임포트 또는 인클루드를 명시하지 않습니다.


    적어주신 예시는 위의 내용과 관련이 없습니다.

    이 문제는 참조가 비었기 때문에 생긴 문제지 상속이나 컴파일에 관한 문제가 아닙니다.

    다른 클래스에서 생성한 MyP는 MyPawn의 빈 참조자(널 포인터, MyP == none)이지

    새로운 인스턴스(레벨에 배치한 인스턴스는 더더욱)가 아닙니다.

    이벤트나 함수를 통해 배치한(또는 원하는) 인스턴스의 참조를 MyP에 할당한 뒤 프로퍼티에 엑세스 해야 합니다.

    Comment


      #3
      보통 자신의 폰에 대한 컨트롤은 PlayerController를 상속한 클래스에서 처리합니다. 이 경우 별도로 MyPawn의 현재 인스턴스를 찾을 필요는 없이 그저 PlayerController.Pawn 멤버를 사용하면 됩니다.
      자신의 폰과 컨트롤들을 설정하는 방법은 여기를 참고하세요.

      원하시는 것을 제가 아는 방식으로 구현해보면,

      MyPawn.uc
      Code:
      class MyPawn extends Pawn
      
      var float BaseGroundSpeed;
      ...
      
      exec function SpeedUp()
      {
      BaseGroundSpeed=800
      } event Tick(float DeltaTime) {
      GroundSpeed = BaseGroundSpeed; // SpeedUp 지속시간이 종료되면 속도를 원래대로 돌립니다. if (SpeedUpIsOver) {
      BaseGroundSpeed = Default.BaseGroundSpeed;
      }
      } DefaultProperties {
      BaseGroundSpeed=400
      }
      SeqAct_SpeedUp.uc
      Code:
      class SeqAct_SpeedUp extends SequenceAction
      
      event Activated()
      {
      	local MyPlayerController PC;
      
      	foreach GetWorldInfo().DynamicActors(class'MyPlayerController',PC)
      	{
      		MyPawn(PC.Pawn).SpeedUp();
      	}
      	ActivateOutputLink(0);
      }
      
      DefaultProperties
      {
      	ObjName="Speed up my pawn"
      	ObjCategory="My Action"
      
      	InputLinks.Empty
      	InputLinks(0)=(LinkDesc="Start")
      
      	OutputLinks.Empty
      	OutputLinks(0)=(LinkDesc="Finished")
      
      	VariableLinks.Empty
      }
      이제 키즈맷을 띄워서 New Action>>My Action>>Speed up my pawn 을 클릭하여 엑션을 추가하고, 원하는 트리거에 연결하면, 모든 플레이어의 속도가 빨라집니다.

      SeqAct_SpeedUp.Activated() 함수 내용을 수정해서 어느 지역 근처에 있는 플레이어 또는 자신 또는 기타 등등의 조건을 만들어 넣을 수 있습니다. 예를 들어, 변수로 충돌 볼륨을 설정할 수 있게 해주고 그 안에 있는 플레이어만 속도를 올리는 것도 가능합니다.

      Comment


        #4
        Originally posted by junhan627 View Post
        보통 자신의 폰에 대한 컨트롤은 PlayerController를 상속한 클래스에서 처리합니다. 이 경우 별도로 MyPawn의 현재 인스턴스를 찾을 필요는 없이 그저 PlayerController.Pawn 멤버를 사용하면 됩니다.
        PlayerController.Pawn은 플레이어 컨트롤러 인스턴스가 빙의(Possess)한 폰 인스턴스의 참조입니다.

        MyPawn.uc
        Code:
        function SpeedUp()
        {
             self.GroundSpeed = 800;
        }

        MyPlayerController.us
        Code:
        MyPlayerController extends PlayerController;
        
        function CallSpeedUp()
        {
              MyPawn(self.Pawn).SpeedUp();
        }

        Comment

        Working...
        X