inflearn logo
강의

Course

Instructor

[C# and Unity MMORPG Game Development Series] Part 7: MMO Content Implementation (Basics of Unity + C# Server Integration)

PushAfter 사용 질문

189

mogun3329

5 asked

0

JonTimer 강의에서 학습한 PushAfter에 관한 질문

 

Arrow 실습 코드에 적용해 보았는데 제가 이해한 것이 맞는 지 궁금하여 질문 드립니다.

 

GameRoom 클래스 코드 일부

// 누군가가 주기적으로 호출해줘야 한다
public void Update()
{
    foreach (Monster monster in _monsters.Values)
    {
        monster.Update();
    }

    //foreach (Projectile projectile in _projectiles.Values)
    //{
    //    projectile.Update();
    //}

    Flush();
}
Arrow arrow = ObjectManager.Instance.Add<Arrow>();
if (arrow == null)
    return;

arrow.Owner = player;
arrow.Data = skillData;
arrow.PosInfo.State = CreatureState.Moving;
arrow.PosInfo.MoveDir = player.PosInfo.MoveDir;
arrow.PosInfo.PosX = player.PosInfo.PosX;
arrow.PosInfo.PosY = player.PosInfo.PosY;
arrow.Speed = skillData.projectile.speed;
Push(EnterGame, arrow);

arrow.Test();

Arrow 클래스 코드 일부

bool check;
public void Test()
{
        // TODO : Room is null
	while (!check)
	{
		Update();
	}
}

//long _nextMoveTick = 0;

public override void Update()
{
	if (Data == null || Data.projectile == null || Owner == null || Room == null)
	{
                return;
        }
	check = true;

	//if (_nextMoveTick >= Environment.TickCount64)
	//	return;

	//long tick = (long)(1000 / Data.projectile.speed);
	//_nextMoveTick = Environment.TickCount64 + tick;

	Vector2Int destPos = GetFrontCellPos();
	if (Room.Map.CanGo(destPos))
	{
		CellPos = destPos;

		S_Move movePacket = new S_Move();
		movePacket.ObjectId = Id;
		movePacket.PosInfo = PosInfo;
		Room.Broadcast(movePacket);

		Console.WriteLine("Move Arrow");
	}
	else
	{
		GameObject target = Room.Map.Find(destPos);
		if (target != null)
		{
			target.OnDamaged(this, Data.damage + Owner.Stat.Attack);
		}

		// 소멸
		Room.Push(Room.LeaveGame, Id);
	}

	Room.PushAfter((int)(1000 / Data.projectile.speed), Update); 
}

GameRoom 클래스에서 Update를 계속 실행하는 것이 아니라 Arrow를 EnterGame한 후 Test를 한 번만 실행시키면 되는 거 맞을까요?

C# unity

Answer 1

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

kmg013329님의 질문을 읽어보니, GameRoom 클래스의 Update 메소드와 Arrow 클래스의 구현에 대한 이해를 확인하시고자 하는 것 같아요.

GameRoom 클래스의 Update 메소드는 게임 내에서 시간이 흐름에 따라 주기적으로 각 객체들의 상태를 갱신하기 위해 필요합니다. 여기서는 모든 Monster 객체들의 Update 메소드를 순회하며 호출하고 결과적으로 Flush 메소드까지 호출하게 됩니다. 주석 처리된 Projectile 객체 역시 같은 맥락에서 처리될 수 있습니다.

Arrow 클래스 관련 코드에서 보면, Arrow 인스턴스 생성 후, 기본 설정을 하고 Push(EnterGame, arrow)를 호출하여 게임 세계에 화살 객체를 등록합니다. 이때 Test 메소드 호출 시 즉각적인 Update 호출을 통해 Arrow의 상태를 갱신하는 시도가 보입니다.

그러나, 질문 주신 부분에 따르면, Arrow 객체의 Update 메소드를 단 한 번만 호출하려는 의도로 보이나, 실제로는 Arrow 객체의 Update 메소드는 Room.PushAfter를 사용하여 주기적으로 자신을 다시 호출하도록 예정되어 있습니다. 이는 Arrow 객체가 일정 시간 간격으로 지속적으로 상태를 업데이트하며, 예를 들어 움직임이나 다른 객체에 대한 상호작용 등을 처리할 수 있게 합니다.

따라서, GameRoom 클래스에서 Update를 계속 실행하되, Arrow 객체의 경우 EnterGameTest를 한 번 실행시키는 것이 아니라, Arrow 객체 스스로가 설정한 시간 간격에 따라 Update 메소드가 반복적으로 호출되도록 설계된 것이 맞습니다. 이를 통해 Arrow 객체는 독립적으로 자신의 로직을 주기적으로 실행할 수 있으며, 이는 게임 프로그래밍에서 자주 사용되는 패턴 중 하나입니다.

즉, GameRoomUpdate는 게임 상태의 전체적인 갱신을 담당하고, 개별 객체(예: Arrow)는 자체적인 Update 메서드를 통해 개별 로직을 주기적으로 처리하는 구조로 이해하시면 됩니다.

MessagePack

0

84

1

본인 플레이어 이동 관련 질문

0

49

1

Part7 Part9 질문이 있습니다.

0

71

1

.

0

116

1

.

0

105

2

게임 로직 루프에서 게임 틱 누락으로 인한 높은 CPU 사용 문제

0

91

1

타일 팔레트 깔았는데도 안돼요

0

115

2

2D로 그냥 만들어도 되나요?

0

81

2

지난 강의와 이어지는게 맞을까요?

0

80

2

순환참조 문제로 인해 발생하는 문제는 없을까요?

0

162

2

유니티 클라와 C++서버연동

0

277

2

멀티플레이 테스트 환경 관련 질문입니다

0

207

3

강의 후반부에 순서 동기화를 위해 잡큐를 사용 안 한 부분 질문입니다!

0

150

2

코드 관련한 몇 가지 질문입니다!

0

153

2

3d 프로젝트 이동 동기화 관련

0

321

4

파트 7 스트레스 테스트 질문 드립니다.

1

189

2

맵 이동 방식

0

133

0

맵 이동 관련해서 질문드립니다.

0

91

1

안녕하세요 도저히 알 수 없는 오류가 나와서 질문드려요,,

0

201

2

안녕하세요. 일전에 질문 드린 포폴 준비 관련 질문의 추가 질문입니다!

0

159

1

[팁] 2024년 기준 버전 이슈?

0

453

1

SendBuffer.cs 삭제 후 대체 되는 부분의 장단점?

1

200

1

지금 강의의 유니티 클라를 IOCP 서버와 연동하는 것

0

333

2

강의중 GameRoom의 참조값에 대해 질문드립니다.

0

241

1