안기훈_자료_보존용_계정 MYPI

안기훈_자료_보존용_계정
접속 : 2875   Lv. 49

Category

Profile

Counter

  • 오늘 : 1 명
  • 전체 : 239953 명
  • Mypi Ver. 0.3.1 β
[Unreal 게시판] Tick() 함수의 발동 조건 (0) 2014/11/28 PM 01:11
Question>

질문1:
현재 Actor 클래스에서 A1, A2라는 액터를 두개 선언했습니다.
이 후 각각에 움직임을 주기 위해서 Tick 함수를 선언했는데
두 액터를 구분하는 법을 잘 모르겠네요


begin object class=StaticMeshComponent Name=Elevator
StaticMesh=StaticMesh'LT_Buildings2.SM.Mesh.S_LT_Buildings_SM_BunkerWallA_STR' // staticmesh를 설정
HiddenGame=false // 화면에 출력할 것인가를 결정
end object
CollisionComponent = Elevator
Components.Add(Elevator)
bCollideActors=true
bBlockActors=true


// 생성된 Ball의 설정
begin object class=StaticMeshComponent Name=Ball
StaticMesh=StaticMesh'EngineMeshes.Sphere' // staticmesh를 설정
Scale3D = (X=0.5,Y=0.5,Z=0.5) // StaticMesh의 3차원 크기를 제어
HiddenGame=false // 화면에 출력할 것인가를 결정
end object
CollisionComponent = Ball
Components.Add(Ball)
bCollideActors=true
bBlockActors=true


다음과 같이 액터들을 생성한 후에
틱 함수에서 SetLocation으로 위치를 바꾸어 줘야 하는데
어떻게 해야할지 감을 못잡겠네요


auto state Idle
{
function Tick(float DeltaTime)
{
local PlayerController PC;
local StaticMeshActor A;
local float StopDist; //멈출 지점의 변수
//local float StopZ;

//N = BallMass * Gravity * Cos90;//4.9
f = BallMass * Gravity * Sin90;//약 8.48

// 플레이어를 검색한다.
foreach LocalPlayerControllers( class'PlayerController', PC )
{
break;
}

// 모든 액터들 중에서 MyElevator란 태그를 갖고 있는 액터를 검색한다.
foreach AllActors(class'StaticMeshActor', A, none)
{
// MyElevator tag라면
if (String(A.tag) == "MyElevator")
{
Elevator_1 = A;
`log("************ Find My Elevator ************");
}
}

//F=ma에 따라 a는 9.7938
//S= S.+vt+(1/2)at^2를 통해 t를 구하면 8.25047

//DeltaTime = 5;// 시간을 넣어준다
//Blocation.x = N;// Fx의 값을 공위 x값
Blocation.z = f;// Fy의 값을 공의y값
SetLocation(Location + Blocation * DeltaTime * 10);
StopDist = VSize(PC.Pawn.Location - Location);//공의 위치를 정해준다. 0.1은 마찰력
//StopDist = VSize(PC.Pawn.Location.Z - myElevator.Location.Z);//공의 위치를 정해준다. 0.1은 마찰력
//StopZ = PC.Pawn.Location.Z - Elevator_1.Location.Z;


`log("**** StopDist : " @ StopDist);
//`log("Pawn - Elevator:" @ StopDist);

//벽에 근접하게 되면
if (StopDist > 0 && StopDist > 1500)
GotoState('Stop');//스테이트 stop으로 이동
}
}


고수들의 답변 부탁드립니다 ㅠㅠ



질문2:
Actor 클래스를 상속받아 작성한 코드입니다.
표현하려는 목표는 아래에서 올라오는 바닥과 일정 높이의 공이 떨어지면서
바닥과 부딪히는 것을 표현하려는 것입니다.
현재 바닥의 움직임은 구현했지만 공의 경우는
현재 스테틱메시로 불러와 Tag명을 검색해서
SetLocation(Ball.Location - Elevator.Location)과 같은 방식으로 했는데
생각한대로 움직여지지가 않네요~ ㅠㅠ

-------------------------------------------------------------

Answer>

답변1:
우선 'function Tick( float DeltaTime )'이라고 하시면 올바른 표현이 아니고요.
'event Tick( float DeltaTime )'으로 하셔야 올바른 표현입니다.
(어느쪽으로 해도 실행에는 문제가 없지만, 관례상 올바른 표현을 하시는 게 좋습니다.^^)

그런데,
위 source는 어떤 class를 상속한 class의 source인가요?



답변2:
그런 식으로는 움직이게 하실 수 없습니다.

pawn과 controller를 제대로 만드셔야 합니다.
이에 대해서는 관련 강좌를 참고해 주시기 바라고요.

그리고,
Tick()은 모든 actor가 다 사용할 수 있지 않습니다.

FORCEINLINE UBOOL WantsTick() const { return !bStatic && !bTickIsDisabled; }

위 내용은 class Actor에 있는 내용인데, 보시다시피,
bStatic과 bTickIsDisabled가 FALSE일 때만 허용됩니다.
그런데, 위 source에는 bStatic과 bTickIsDisabled를
어떻게 처리하셨는 지가 나와 있지가 않네요.
아마도, 위 조건과 다르게 처리됐을 확률이 높습니다.

2줄 요약하면, 아래와 같습니다.^^
1>관련 강좌를 보시면서, pawn과 controller를 제대로 만드시고요.
2>Tick() 호출 조건을 맞게 수정해 주세요.







Tag:
안기훈, Kee Hoon Ahn, 언리얼, Unreal, UDK, iPhone, iPad, app, 앱, iOS

신고

 
X