inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

따라하며 배우는 웹 게임

상대방 캐릭터 Spawn 해주기

2번째 로그인 시 원래 있던 캐릭터가 생성되지 않습니다.

361

고산

작성한 질문수 4

0

M.match_join이 호출되긴 하는데
PlayerView.js에서 op_code 값이 2가 나오는지 찍어봐도 찍히지 않고 호출되지 않는 거 같습니다.
import React, { useEffect, useState, useRef } from 'react'
import '../App.css';

const PlayView = () => {
    const [isHit, setIsHit] = useState(false)
    const setTimeOutRef = useRef(null);

    useEffect(() => {
      if(!window.pc.app.gameApp) return;
      window.pc.app.gameApp.socket.onmatchdata = (matchState) => {
        let jsonResult = JSON.parse(String.fromCharCode.apply(null, new Uint8Array(matchState.data)))
        switch (matchState.op_code) {
          case 1:
            onPlayerMove(jsonResult)
            break;
          case 2:
            onHandleInitialData(jsonResult)
            break;
          case 3:
            onPlayerSpawn(jsonResult)
            break;
          default:
            break;
        }
      }

    }, [])

    const onPlayerMove = () => {

    }

    const onHandleInitialData = (data) => {
      const myAccountId = window.pc.app.gameApp.user.user_id;
      console.log('onHandleInitialData', data);
      for (const player of data.players) {
        if(myAccountId === player.user_id) {
          continue;
        }
        console.log(player);
        setTimeout(() => {
          onPlayerSpawn(player);
        }, 1000);
      }
    }

    const onPlayerSpawn = (data) => {
      // Create a new player entity.
      let playerEntity = window.pc.app.root.findByName("Player");
      let newPlayerEntity = playerEntity.clone();

      // Put Location into new player entity.
      if(data.position) {
        let position = data.position;
        newPlayerEntity.rigidbody.teleport(position[0], position[1], position[2]);
      } else {
        newPlayerEntity.rigidbody.teleport(0, 3, 0);
      }
      
      // addChild into Root
      newPlayerEntity.enabled = true;
      let sceneRoot = window.pc.app.root.findByName("Root");
      sceneRoot.addChild(newPlayerEntity);
    }
    

    useEffect(() => {
        window.pc.app.on("boxHit", listener);
        return () => {
          window.pc.app.off("boxHit", listener)
        }
        // window.addEventListener("message", listener)
    
        // return () => {
        //   window.removeEventListener("message", listener);
        // }
      }, [])
      
    const listener = (event) => {
    // if(event.origin !== "http://localhost:3000")
    //   return;
    
    clearTimeout(setTimeOutRef.current);
    setIsHit(true);
    setTimeOutRef.current = setTimeout(() => {
        setIsHit(false);
    }, 1000);
    }
    
  return (
    <div>
        {isHit && <div className='Popup'>Box is hit</div> }
    </div>
  )
}

export default PlayView
 
local nk = require("nakama");
local M = {}

local function on_player_move(context, dispatcher, tick, state, message)
	local player = state.presences[message.sender.session_id]
	if player == nil then
		return
	end

	local ok, decode_data = pcall(nk.json_decode, message.data)
	if not ok then
		nk.session_disconnect(message.sender.session_id)
		return
	end

	player.info["position"] = decode_data.position;
	dispatcher.broadcast_message(1, message.data)

end

local function on_player_spawn(context, dispatcher, tick, state, message)
	-- 실제로 매치에 있는 사람이 보낸 것인지 확인. 아니면 return
	local player = state.presences[message.sender.session_id]
	if player == nil then
		return
	end

	dispatcher.broadcast_message(3, message.data)
end

function M.match_init(context, initial_state)
	local state = {
		presences = {},
		empty_ticks = 0
	}
	local tick_rate = 30 -- 1 tick per second = 1 MatchLoop func invocations per second
	local label = ""

	return state, tick_rate, label
end

function M.match_join_attempt(context, dispatcher, tick, state, presence, metadata)
    local acceptuser = true
    return state, acceptuser
end

function M.match_join(context, dispatcher, tick, state, presences)
	for _, presence in ipairs(presences) do
		
		state.presences[presence.session_id] = presence
		state.presences[presence.session_id].info = {
			user_id = presence.user_id,
			position = {0, 3, 0}
		}
	end

	local player_infos = {}
	for _, p in pairs(state.presences) do
		table.insert(player_infos, p.info)
	end

	local player_init_data = {
		players = player_infos,
		tick = tick
	}
	
	dispatcher.broadcast_message(2, nk.json_encode(player_init_data), presences)

	return state
end

function M.match_leave(context, dispatcher, tick, state, presences)
	for _, presence in ipairs(presences) do
		state.presences[presence.session_id] = nil
	end

	return state
end

function M.match_loop(context, dispatcher, tick, state, messages)

	print("messages: ", nk.json_encode(messages))
	for _, message in ipairs(messages) do
		if (message.op_code == 1) then
			local ok = pcall(on_player_move, context, dispatcher, tick, state, message)
			if not ok then
				nk.session_disconnect(message.sender.session_id)
			end
		end
		if (message.op_code == 3) then
			local ok = pcall(on_player_spawn, context, dispatcher, tick, state, message)
			if not ok then
				nk.session_disconnect(message.sender.session_id)
			end
		end
	end

	return state
end

function M.match_terminate(context, dispatcher, tick, state, grace_seconds)
    return state
end

function M.match_signal(context, dispatcher, tick, state, data)
    return state, data
end

return M

react

답변 1

0

고산

아무리 이것저것 바꿔봐도 해결되지 않습니다.

setTimeout 시간 값을 바꿔도 안되고

애초에 

dispatcher.broadcast_message(2, nk.json_encode(player_init_data), presences)
이후 onmatchdata에 진입을 하지 않고 onPlayerSpawn으로 넘어가버립니다.

0

고산

정확한 해결방법은 아니지만 열려있는 브라우저들을 최대한 줄였더니 성공하는 케이스가 있네요... 원인은 모르겠습니다..

0

John Ahn

답이 늦어서 죄송했습니다 ㅠㅠ !! 
담에 또 안되신다면 저장소 주소와 같이 올려주신다면 직접해보겠습니다!!!

요즘도 mcp 많이 이용하시는 추세인가요?

0

2

0

이제 업데이트는 없는건가요 ㅠ

0

7

0

뭘 따라가야 하는지 잘 모르겠습니다.

0

14

1

56강 프로젝트 초기화 커밋 시 main이 아니라 master라는 칩이 붙습니다.

0

17

2

awesome mcp

0

26

2

VSCODE Extension Claude와 터미널 차이

0

37

1

claude-nextjs-starterkit에서 .claude폴더 생성

0

40

2

Claude Code 자동 Update 활성화 방법은?

0

37

2

Vercel 배포 과정에서 오류가 발생합니다

0

42

2

리프레시토큰

0

46

1

/memory를 쓸 필요가 있나요? 그냥 md 들어가서 편집하면 안되나용?

0

66

2

로그인 확인

0

66

3

서브에이전트 생성시 레퍼런스 및 스킬 생성

0

59

2

Git, Github 기초부터 실전까지 중 질문드립니다.

0

82

3

재생이 안됩니다.

0

60

1

클로드 설치 및 강의 미션 관련

0

68

1

/config Thinking mode 설정

0

61

2

문제점 2가지

1

580

4

이 소스코드를 다운받고 브라우저 여러개로 테스트해보면

0

261

1

도표자료에서 5번째 문서가 주소가 4번째 문서랑 같은거 같아요 수정 부탁드리겠습니다

0

210

1

this.app.fire 시 문제 해결

1

254

1

Ref를 만드신 이유에 대해서 질문드립니다.

0

285

1

docker-compose up --build 시 에러

0

630

2

js 파일이 생성되지 않습니다.

0

377

2