마우스 인터페이스 만들기 - 스케일폼 버전.

반응형
상위 링크 : http://udn.epicgames.com/Three/DevelopmentKitGemsKR.html
참조 링크 : http://udn.epicgames.com/Three/DevelopmentKitGemsCreatingAMouseInterfaceKR.html

스케일폼이 마우스 위치 변화를 감지하면 새 위치를 언리얼 스크립트로 넘겨준다.


어도비 플래시로 쓴 액션 스크립트.
마우스가 움직이면 커서를 호출한 레이어의 위치를 스케일폼의 마우스 위치로 설정한 다음,
언리얼 스크립트에도 스케일폼의 마우스 위치를 전성혼다.

import flash.external.ExternalInterface;

// 보통의 "윈도우" 포인터 숨김
Mouse.hide();

var mouseListener:Object = new Object();

mouseListener.onMouseMove = function() {
  // 커서 인스턴스 위치를 마우스 위치로 설정
  cursor._x = _root._xmouse;
  cursor._y = _root._ymouse;
   
  // 언리얼스크립트에 새 마우스 좌표 전달
  ExternalInterface.call("UpdateMousePosition", _root._xmouse, _root._ymouse);
   
  updateAfterEvent();
};

Mouse.addListener(mouseListener);



스케일폼 무비의 언리얼 스크립트 부분.
function Init(optional LocalPlayer LocalPlayer)
{
 // 스케일폼 무비 초기화
 Super.Init(LocalPlayer);

 Start();
    Advance(0);
}

event UpdateMousePosition(float X, float Y)
{
 local MouseInterfacePlayerInput MouseInterfacePlayerInput;

 if (MouseInterfaceHUD != None && MouseInterfaceHUD.PlayerOwner != None)
 {
  MouseInterfacePlayerInput = MouseInterfacePlayerInput(MouseInterfaceHUD.PlayerOwner.PlayerInput);

  if (MouseInterfacePlayerInput != None)
  {
   MouseInterfacePlayerInput.SetMousePosition(X, Y);
  }
 }
}

요정도가 중요한 부분인듯. 나머지는 hud에서 렌더링 하고 계산하고 하는 부분.
그리고 이벤트 처리하는 부분이 주를 이룬다.

ㅇㅇ 그리고 2d좌표에 따라 마우스 3D 좌표 구하는 부분도 나름 쓸만한듯.
function Vector GetMouseWorldLocation()
{
  local MouseInterfacePlayerInput MouseInterfacePlayerInput;
  local Vector2D MousePosition;
  local Vector MouseWorldOrigin, MouseWorldDirection, HitLocation, HitNormal;

  // 적합한 캔버스와 플레이어 오너가 있는지 확인
  if (Canvas == None || PlayerOwner == None)
  {
    return Vect(0, 0, 0);
  }

  // 새 플레이어 인풋을 구하기 위해 형 변환
  MouseInterfacePlayerInput = MouseInterfacePlayerInput(PlayerOwner.PlayerInput);

  // 플레이어 인풋이 적합한지 확인
  if (MouseInterfacePlayerInput == None)
  {
    return Vect(0, 0, 0);
  }

  // 마우스 위치를 IntPoint 로 저장하나, Vector2D 로 저장 필요
  MousePosition.X = MouseInterfacePlayerInput.MousePosition.X;
  MousePosition.Y = MouseInterfacePlayerInput.MousePosition.Y;
  // 마우스 위치를 Deproject 하여 캐시 벡터에 저장
  Canvas.DeProject(MousePosition, MouseWorldOrigin, MouseWorldDirection);

  // 실제 마우스 월드 위치를 구하기 위해 trace 수행
  Trace(HitLocation, HitNormal, MouseWorldOrigin + MouseWorldDirection * 65536.f, MouseWorldOrigin , true,,, TRACEFLAG_Bullet);
  return HitLocation;
}


신기하게도 키즈멧 이벤트도 만들어 줄 수 있다.
class SeqEvent_MouseInput extends SequenceEvent;

event Activated()
{
  local MouseInterfaceInteractionInterface MouseInteractionInterface;

  // originator 를 형 변환하여 마우스 인터액션 인터페이스임을 확인
  MouseInteractionInterface = MouseInterfaceInteractionInterface(Originator);

  if (MouseInteractionInterface != None)
  {
    // 이벤트가 활성화되었을 때 적절한 값을 밀어줄 수 있도록 값 구해오기
    MouseWorldOrigin = MouseInteractionInterface.GetMouseWorldOrigin();
    MouseWorldDirection = MouseInteractionInterface.GetMouseWorldDirection();
    HitLocation = MouseInteractionInterface.GetHitLocation();
    HitNormal = MouseInteractionInterface.GetHitNormal();
  }
}

그리고 시퀀스에 대한 값을 셋팅해 준다.
defaultproperties
{
 ObjName="Mouse Input"
 ObjCategory="Input"
 
 bPlayerOnly=false
 MaxTriggerCount=0

 OutputLinks(0)=(LinkDesc="Left Pressed")
 OutputLinks(1)=(LinkDesc="Left Released")
 OutputLinks(2)=(LinkDesc="Right Pressed")
 OutputLinks(3)=(LinkDesc="Right Released")
 OutputLinks(4)=(LinkDesc="Middle Pressed")
 OutputLinks(5)=(LinkDesc="Middle Released")
 OutputLinks(6)=(LinkDesc="Scroll Up")
 OutputLinks(7)=(LinkDesc="Scroll Down")
 OutputLinks(8)=(LinkDesc="Mouse Over")
 OutputLinks(9)=(LinkDesc="Mouse Out")

 VariableLinks(1)=(ExpectedType=class'SeqVar_Vector',LinkDesc="HitLocation",bWriteable=true,PropertyName=HitLocation)
 VariableLinks(2)=(ExpectedType=class'SeqVar_Vector',LinkDesc="HitNormal",bWriteable=true,PropertyName=HitNormal)
 VariableLinks(3)=(ExpectedType=class'SeqVar_Vector',LinkDesc="MouseWorldOrigin",bWriteable=true,PropertyName=MouseWorldOrigin)
 VariableLinks(4)=(ExpectedType=class'SeqVar_Vector',LinkDesc="MouseWorldDirection",bWriteable=true,PropertyName=MouseWorldDirection)
}
위와같이 셋팅해 두면 키즈멧에서 셋팅한 대로의 키즈멧 이벤트가 만들어 진다.
두번째 사진에서 보면 생성한 MouseInterfaceKActor가 위의 코딩대로 만들어 졌음을 알 수 있다.


에디터에서는 잘 되는 비쥴스툐도로 실행하면 안되는군.. 이유가 머지..흐음...
TAGS.

Comments