https://www.acmicpc.net/problem/1932

 

1932번: 정수 삼각형

첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.

www.acmicpc.net

이 문제의 경우 여러가지 생각을 하게 해주었다 일단 처음에 visual studio 에서 

스택 사이즈를 너무 많이 먹는다고 경고를 띄우고 강제 종료되서 나를 개빡치게 했다

이건 지역변수가 스택에 할당 되서 문제였다

그래서 문제 해결법은 그냥 전역변수에 사이즈가 큰 배열을 갔다 박으면 되는 문제였다

또한 short로 하면 이문제는 틀렸습니다가 나온다 그이유는 각각의 수의 범위들은 short로

처리가 가능하지만 이 값들의 합은 short 범위 내에 있지 않을 가능성이 크기 때문이다

이에 변수들을 int로 정의 해주면 해결이었다

dp에 bottom up방식을 사용해서 풀었다.

나는 이문제가 이전에 풀었던 2 3짜리 문제 보다 훨씬 쉬었다

이문제의 경우 총 3개의 경우의 수를 생각해주어야한다

삼각형의 왼쪽끝과 오른쪽끝 그리고 이둘다 아닐경우가 다다르다

왼쪽끝과 오른쪽끝의 경우 자신의 부모가 하나밖에 없기 때문에 확정으로 값이 나온다

왼쪽은 이렇게 dp[j][k] = tri[j][k]+ dp[j - 1][k];

오른쪽은 이렇게 dp[j][k] = tri[j][k] + dp[j - 1][k-1];

둘다 아닌경우는 dp[j][k] = max((tri[j][k] + dp[j - 1][k]), (tri[j][k] + dp[j - 1][k - 1]));

이렇게 3개로 나누어줘야한다 아니면 불필요한 범위까지 계산하게 되서 백준에서 오류를 띄워준다.

#include <iostream>
using namespace std;
int tri[501][501];
int dp[501][501];

int max(int x, int y) {
	return x > y ? x : y;
}
int main() {
	int trisize;
	cin >> trisize;
	int maxnum = 0;

	for (int i = 0; i < trisize; i++) {
		for (int j = 0; j < i + 1; j++) {
			cin >> tri[i][j];
		}
	}
	dp[0][0] = tri[0][0];
	for (int j = 1; j < trisize; j++) {
		for (int k = 0; k <= j; k++) {
			if (k == 0) {
				dp[j][k] = tri[j][k]+ dp[j - 1][k];
			}
			else if (k == j) {
				dp[j][k] = tri[j][k] + dp[j - 1][k-1];
			}
			else {
				dp[j][k] = max((tri[j][k] + dp[j - 1][k]), (tri[j][k] + dp[j - 1][k - 1]));
			}
		}

	}
	for (int i = 0; i < trisize; i++) {
		if (dp[trisize-1][i] > maxnum) {
			maxnum = dp[trisize - 1][i];
		}
	}
	cout << maxnum;
}

 

'백준(코테준비) > DP' 카테고리의 다른 글

백준 10844  (0) 2022.12.19
백준 2156  (0) 2022.12.19
백준 1912  (0) 2022.12.19
백준 11053  (0) 2022.12.15
백준 2579  (0) 2022.12.15

https://www.acmicpc.net/problem/11053

 

11053번: 가장 긴 증가하는 부분 수열

수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이

www.acmicpc.net

처음 풀때 잘 못 생각했었다 순열안에 수를 뽑아 증가하는 수열을 만드는 거라 생각해서

처음 부터 다시 풀어야 했다

이번 꺼는 생각하는 게 좀 어려웠다 자기 자신의 이전의 경로의 수가 dp로 들어가야한다.

10 20 10 30 20 50

이렇게 수열이 있으면 처음 이렇게 만 있을 때 증가하는 수열들은 각각 하나 씩이라고 생각하자

그 후에 내 이전의 원소들을 보면서 비교한다 내 이전의 원소가 나보다 작으면

나의 수에 내 이전 원소 까지의 증가수를 합쳐준다 

예시로 

20이 10을 만나게 되면 10은 하나짜리 증가 수열이고 20은 10보다 크니

10 20은 증가수열이다 이에 서로까지의 증가 수열 수를 더해준다 이에 20은 

2의 증가 수열을 갖는다

하지만 이 때 내 이전 원소가 나보다 작을 수 있는 경우의 수가 여러 개이므로 

내 이전까지의 증가수열 수 + 1 끼리를 비교하여 가장 큰값을 내가 갖고 있어야 한다

이에 dp[i]=max(dp[i],dp[j]+1)  이 필요하다

이에 자기자신의 값과 내 이전의 증가수열이 나를 만났을 때의 개수 와 비교해 준다

이렇게 점점 자기자신보다 작은애까지의 증가수열 + 나의 값이 최대가 되는 것을 구하는게

핵심이다

#include <iostream>
using namespace std;
int max(int x, int y)
{
	return x > y ? x : y;
}
int main() {
	int arr[1001];
	int dp[1001]; //자신 까지의 증가 수열 수
	int maxnum=0;
	int inputn;
	cin >> inputn;
	for (int i = 0; i < inputn; i++) {
		cin >> arr[i];
		dp[i] = 1;
	}

	for (int i = 1; i < inputn; i++) {
		for (int j = 0; j <= i; j++) {
			if (arr[i] > arr[j]) {
				dp[i] = max(dp[i], dp[j]+1);
			}
		}
	}
	
	for (int i = 0; i < inputn; i++) {
		if (dp[i] > maxnum)
			maxnum = dp[i];
	}

	cout << maxnum;
}

'백준(코테준비) > DP' 카테고리의 다른 글

백준 10844  (0) 2022.12.19
백준 2156  (0) 2022.12.19
백준 1912  (0) 2022.12.19
백준 1932  (1) 2022.12.16
백준 2579  (0) 2022.12.15

 

https://www.acmicpc.net/problem/2579

 

2579번: 계단 오르기

계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. <그림 1>과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점

www.acmicpc.net

백준 2579 번은 dynamic programming을 사용해서 풀어야 한다

dp를 하면서 느낀거는 점화식을 세우는 게 중요한거 같다.

일단 이 문제의 경우 기준은 마지막 계단이다.

마지막 계단을 올라가는 방법은 2가지가 있다

연속된 3계단을 올라갈 수 없으니 전계단과 전전전계단을 밟고 올라오는 경우의 수와

전전계단을 밟고 마지막 계단에 도착하는 경우의 수가 있다

이경우  점화식은 2개가 존재한다

 

이를 위해 i번째 계단까지 올라왔을 때의 최댓값을 저장해줄 dp 배열

각계단의 점수 값을 기록해줄 stair 배열을 생성해준다.

dp[i-3]+stair[i-1]+stair[i]

 

dp[i-2]+stair[i]

이렇게 2개가 있다

그리고 이점화식은 i가 3이상 일 때 부터 작동한다

이에 우리의 dp[0],dp[1],dp[2]는 반복문에 들어가기전에 미리 값을 삽입해 놓아야 한다.

#include <iostream>
using namespace std;
int max(int x, int y)
{
	return x > y ? x : y;
}
int main() {
	int inputn = 0;
	int stair[301] = { 0, };
	int dp[301] = { 0, };
	cin >> inputn;
	for (int i = 0; i < inputn; i++) {
		cin >> stair[i];
	}
	dp[0] = stair[0];
	dp[1] = max(stair[1] + dp[0],stair[1]);
	dp[2] = max(stair[2]+stair[1], dp[0]+stair[2]);

	for (int i = 3; i < inputn; i++) {
		dp[i] = max(stair[i] + stair[i - 1] + dp[i - 3], dp[i - 2] + stair[i]);
	}
	cout << dp[inputn-1];
}

'백준(코테준비) > DP' 카테고리의 다른 글

백준 10844  (0) 2022.12.19
백준 2156  (0) 2022.12.19
백준 1912  (0) 2022.12.19
백준 1932  (1) 2022.12.16
백준 11053  (0) 2022.12.15

일단 본격적으로 게임을 제작하기에 앞서 로그인 창을 먼저 만들어 주었다 

이름은 LoginCanvas 라고 지어주었다 여기서 주의 할점은 유니티를 webgl 빌드로 할 때 일반 INPUT FIELD를 사용하게 되면 한글로 나오지 않는다 이에 TMP(Text Mesh Pro를 사용하여) 한글 font 를 넣은 후 Build 하여야 한다 또한 TMP와 TMP InputField에 component에

이런식으로 Web GL Input 스크립트를 추가해주어야한다 이걸 추가 하지 않으면 InputField에 한글이 입력되지 않는 상황이 발생한다 또한 font가 일반 Arial로 되어있는 경우 한글이 유니티 창에서는 보이지만 막상 컴파일 하면 안 나온다 이에 폰트 파일을 다운 받고 이를 TMP용 폰트(ttf)로 바꿔주면 된다. 이러면 한글이 잘 나온다 또한 CITRL+C/V가 작동이 되기 떄문에 나중에 복사 붙여넣기 하기가 편하다.

 

그다음에 이 캔버스를 관리할 CanvasManager 코드를 작성해 보자.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;
namespace Test{
	public class CanvasManager : MonoBehaviour {

		public static CanvasManager instance;

		public Canvas pLobby;

		public Canvas LoginPanel;

		public Canvas GwanPanel;

		public Image backgroundimage;
		public Button Xbutton;
		public TextMeshProUGUI gwlabel;
		public TextMeshProUGUI Namet;
		public TextMeshProUGUI gwan1;
		public TextMeshProUGUI gwan2;
		public TextMeshProUGUI gwan3;
		public TextMeshProUGUI sogaeT;
		public Button addFriend;
		public TMP_InputField chatinput;
		public Button sendbutton;
		public InputField inputLogin;

		public TMP_InputField inputCode;

		public GameObject lobbyCamera;

		public int currentMenu;

		void Start() {

			if (instance == null) {

				DontDestroyOnLoad(this.gameObject);
				instance = this;
				OpenScreen(0);

			}
			else
			{
				Destroy(this.gameObject);
			}


		}

		public void OpenScreen(int _current)
		{
			switch (_current)
			{
		
				case 0:
					currentMenu = _current;
					pLobby.enabled = true;
					lobbyCamera.GetComponent<Camera>().enabled = true;
					break;

				case 1:
					currentMenu = _current;
					pLobby.enabled = false;
					lobbyCamera.GetComponent<Camera>().enabled = false;
					break;

				case 2:
					ClosePRS();
					currentMenu = _current;
					GwanPanel.enabled = true;
					pLobby.enabled = true;
					LoginPanel.enabled = false;
					lobbyCamera.GetComponent<Camera>().enabled = true;
					break;

			}
		}
		public void ClosePRS()
		{
			pLobby.enabled = false;
		}
		public void setPrs(string name , string gwans, string gwans2 ,string gwans3,string sogae)
        {
			Namet.text = name;
			gwan1.text = gwans;
			gwan2.text = gwans2;
			gwan3.text = gwans3;
			sogaeT.text = sogae;
        }

	}
	
}

자 일단 CanvasManger를 이렇게 길게 작성해주었다 이렇게 작성 해 준 이유는 일단 내가 진행하는 프로젝트에는 상대의 정보를 열람 할 수 있는 기능을 제공한다 일단 inputLogin과 inputCode창에 입력하는건 나중에 백엔드 mysql서버에 정보를 보내고 받아올 때 사용 할 예정입니다 일단 게임이 처음 시작 됬을 때 start() 함수가 실행되면서 우리 방금 만들어 놓은 login창을 띄워 주게 됩니다. instance를 만들어주는 이유는 다른 스크립트 코드에서 이 CanvasManager에 있는 함수나 변수들에 접근을 편하게 할수 있도록 만들어 주었습니다 OpenScreen(0)가 이 기능을 수행하게 될 것입니다. ClosePRS와 setPrs함수는 나중에 프로필창을 띄울 떄 데이터를 넣어 주기 위해 작성했습니다. 여기에 더하여 저희는 javascript로 간단한 servercode를 작성해 보겠습니다.

const fs = require('fs');

const options = {
  key: fs.readFileSync('./private.pem'),
  cert: fs.readFileSync('./public.pem')
};
var express  = require('express');//express module 갖고오기
require('dotenv').config();
var app      = express();// express object생성
var https     = require('https').Server(options,app);// 나중에 프론트에 화상회의 기능이 들어가기에 https 사용
var io       = require('socket.io')(https, { cors: { origin: "*" } });// 서버 2개에서 정보를 가져올 예정이기 때문에 cors처리
const mysql = require('mysql');
const cors = require('cors');
const createApplication = require('express/lib/express');
const { timeStamp } = require('console');
const PORT = 443;
const conn = {  // mysql 접속 설정
   host: process.env.DB_HOST,
   port: '3306',
   user: process.env.DB_USER,
   password: process.env.DB_PASS,
   database: 'wow_town',
   insecureAuth : true
};  

var countMysqlUpdate=0;
app.use("/public/TemplateData",express.static(__dirname + "/public/TemplateData"));
app.use("/public/Build",express.static(__dirname + "/public/Build"));
app.use(express.static(__dirname+'/public'));
app.use(cors());

var clients         = [];//client저장
var clientLookup = {};//나중에 client찾기
var sockets = {};//소켓 저장


//open a connection with the specific client
io.on('connection', function(socket){

  
   socket.on('LOGIN', function (_data)
   {
      let IsSameCode;
      console.log('[INFO] JOIN received !!! ');
      var data = JSON.parse(_data);

      currentUser = {
            name:data.name,
            code:data.code,
            position:data.position,
            rotation:'0',
            id:socket.id,
            socketID:socket.id,
            animation:"",
            userid:"",
            sogaeT:"",
            email:data.name,
            gwansimsa1:"cpp",
            gwansimsa2:"cpp",
            gwansimsa3:"cpp",
            islogged:false,
            costume:""
            };
            currentUser.code=data.code
            let connection = mysql.createConnection(conn); // DB 커넥션 생성
            connection.connect();   // DB 접속
            
            let sql = "SELECT distinct avatar.id,invite_code, avatar.nick_name,type,description,costume_idx FROM avatar join user join avatar_interest on user.id=avatar.user_id and avatar_interest.avatar_id=avatar.id  where user.email="+"'"+data.name+"'";
            connection.query(sql, function (err, results, fields) {
               if (err) {
                  console.log(err);
               }
               let recv=results[0];
               let recv1=results[1];
               let recv2=results[2];
               
               if(typeof recv == "undefined" || recv == null || recv == "" ||recv.invite_code != currentUser.code){
                  return 0;
               }
               currentUser.islogged=true;
               currentUser.userid=String(results[0].id);
               console.log(recv.user_id);
               currentUser.name=recv.nick_name;
               currentUser.costume=String(results[0].costume_idx);
               socket.emit("LOGIN_SUCCESS",currentUser.id,currentUser.name,currentUser.position,currentUser.userid,currentUser.costume);
               console.log('[INFO] player '+currentUser.name+': logged!');
               console.log('[INFO] currentUser.position '+currentUser.position);   
               console.log('[INFO] currentUser.code '+currentUser.code);
               console.log('[INFO] currentUser.code '+currentUser.costume);
               

               
               currentUser.gwansimsa1=results[0].type;
               currentUser.gwansimsa2=results[1].type;
               currentUser.gwansimsa3=results[2].type;
               currentUser.sogaeT=results[0].description;
               console.log(currentUser.userid);
               console.log(typeof(currentUser.userid));

               
               console.log(currentUser.sogaeT);
               console.log(currentUser.gwansimsa1);
               clients.push(currentUser);
                  
        
               clientLookup[currentUser.id] = currentUser;
               
               sockets[currentUser.id] = socket;//add curent user socket
               
               console.log('Total players: ' + clients.length);
               /*********************************************************************************************/   
               
      
               clients.forEach( function(i) {
                  if(i.id!=currentUser.id)
                  { 
                
                  socket.emit('SPAWN_PLAYER',i.id,i.name,i.position,i.gwansimsa1,i.gwansimsa2,i.gwansimsa3,i.sogaeT,i.userid,i.costume);
                  
                  }
            
               });
               
            
               socket.broadcast.emit('SPAWN_PLAYER',currentUser.id,currentUser.name,currentUser.position,currentUser.gwansimsa1,currentUser.gwansimsa2,currentUser.gwansimsa3,currentUser.sogaeT,currentUser.userid,currentUser.costume);
            
            });
            connection.end();
            console.log(currentUser.name);
            console.log(currentUser.userid);
            console.log('end');
            
   });
   
});
   https.listen(PORT, function(){
   console.log('listening on *:'+PORT);
});

앞으로 실제 서버가 aws에 탑재 되거나 github에 올라 갈때를 대비 하여 민감한 정보들은 환경 변수를 이용하여 나중에 같이 탑재 시켜주는게 좋다 또한 https를 이용할려면 인증서 발급을 해야하니 이것도 처리를 같이 해주도록 한다 또한 백엔드에 mysql에 접근하기 위해서 mysql 모듈도 같이 가져와 준다. 또한 port 설정도 백엔드랑 겹치지 않는 port번호로 설정을 해준다. 또한 앞으로 캐릭터를 저장하기 위한 정보부분에 앞으로 사용할정보들을 같이 넣어준다. 후에 우리가 참가하기 버튼을 누르면

socket.on('LOGIN')
이친구가 정보를 받아 다른 클라이언트들에게 로그인 된 캐릭터들에 정보를 뿌릴 것 이다 참고로 이번에 급하게 개발을 진행하면서 자바스크립트의 비동기 처리에 대해 공부가 부족했어서 콜백함수안에 콜백함수를 작성하는 방식으로 비동기 처리를 해주어서 비효율적이다 후에 javascript 공부를 더 해서 이부분은 보완 할 필요가 있다.
 
let connection = mysql.createConnection(conn); // DB 커넥션 생성
            connection.connect();   // DB 접속
           
            let sql = "SELECT distinct avatar.id,invite_code, avatar.nick_name,type,description,costume_idx FROM avatar join user join avatar_interest on user.id=avatar.user_id and avatar_interest.avatar_id=avatar.id  where user.email="+"'"+data.name+"'";
            connection.query(sql, function (err, results, fields) {
               if (err) {
                  console.log(err);
               }
               let recv=results[0];
               let recv1=results[1];
               let recv2=results[2];
               
               if(typeof recv == "undefined" || recv == null || recv == "" ||recv.invite_code != currentUser.code){
                  return 0;
               }
)};
 
이부분은 mysql서버에 여러분들이 connection을 보내고  정보를 받아오게 된다 이때 정보는 JSON 형식으로 넘어온다
code를 가져오는 이유는 후에 로그인 할때 인증 코드를 발송하는데 이를 mysql서버에 있는 인증코드와 입력한 인증 코드가 같은지를 비교하기 위해 갖고 온다  sql문에 대한 이해가 다들 있을거라고 본다.
이 sql 문을 실행해서 가져온 정보를 이제
    currentUser = {
            name:data.name,
            code:data.code,
            position:data.position,
            rotation:'0',
            id:socket.id,//alternatively we could use socket.id
            socketID:socket.id,//fills out with the id of the socket that was open
            animation:"",
            userid:"",
            sogaeT:"",
            email:data.name,
            gwansimsa1:"cpp",
            gwansimsa2:"cpp",
            gwansimsa3:"cpp",
            islogged:false,
            costume:""
            };
여기 안에 다 채워넣을것이다 sogaeT의 경우 소개의 정보가 들어갈 칸이고 gwansimsa1,2,3은 관심사 정보를 넣을 공간이다 islogged는 같은 이메일로 login 했을때 login을 불가능 하게 만들기 위해 있는 정보이다
  if(typeof recv == "undefined" || recv == null || recv == "" ||recv.invite_code != currentUser.code){
                  return 0;
               }
이부분의 경우 mysql 문이 정보를 못갖고 왔거나 인증 코드가 다르면 socket문이 더이상 실행 되는것을 막는다 mysql이 정보를 못가져왔다는 것은 해당 유저의 정보가 존재 하지 않기 때문이다
 socket.emit("LOGIN_SUCCESS",currentUser.id,currentUser.name,currentUser.position,currentUser.userid,currentUser.costume);
 
이부분은 login이 성공되었기 때문에 자신의 캐릭터를 스폰하기 위해서 client에게 신호를 보낸다
 
               clients.forEach( function(i) {
                  if(i.id!=currentUser.id)
                  {  
                  socket.emit('SPAWN_PLAYER',i.id,i.name,i.position,i.gwansimsa1,i.gwansimsa2,i.gwansimsa3,i.sogaeT,i.userid,i.costume);      
                  }            
               });                  
               socket.broadcast.emit('SPAWN_PLAYER',currentUser.id,currentUser.name,currentUser.position,currentUser.gwansimsa1,currentUser.gwansimsa2,currentUser.gwansimsa3,currentUser.sogaeT,currentUser.userid,currentUser.costume);

그 다음 이부분은 지금 로그인한 캐릭터 정보를 기존에 참가하고 있던 client들에게 정보를 전달하는 역할을 한다

오늘은 여기 까지 작성하도록 하겠다

 

참고자료: 이 제작자의 서버코드에 도움을 많이 받았다 

https://assetstore.unity.com/packages/tools/network/webgl-meta-multiplayer-kit-145882?locale=ko-KR#description

오늘은 저번글에이어 UNITY Webgl 빌드를 통해 게임을 만드는 과정중에서 배운것들을 사용할 것입니다

유티티 webgl 빌드를 통해 빌드를 하게 되면 

이렇게 webgl 사이트에 탑재하는데 필요로 되어지는 template 과 여러가지 결과물들을 만들어 줍니다.

하지만 이렇게 기본으로 제공되어 주는 걸 쓰면 멀티플레이 기능을 사용할 수 없습니다 이에 저희는 

만들어 진 index. html 부분에 자바스크립트 코드를 추가해줘야 겠죠

	<script src="/socket.io/socket.io.js"></script>
	<script src="client.js"></script>

요렇게 코드를 2줄 추가해줌으로 서 앞으로  socket.io를 통해

server와 웹페이지의 client.js webgl빌드를 통해 wasm(웹어셈블리) 언어로 변환되

유니티 콘텐츠간의 통신이

이루어질 것입니다

자 이제 그러면 같은 test 폴더내에 client의 역할을 해줄 client.js를 한번 생성해 줍시다

생성해줍니다 그이후에 코드를 살짝 작성해보겠습니다

var socket = io() || {};
socket.isReady = false;

window.addEventListener('load', function() {
}

client 를 이렇게 작성해줍시다

window.addEventListener('load', function() 

여기서 얘의 역할은 리소스와 연관되어있는 애들이 웹페이지에 모두 로드가 되어지면 실행되게 해주는 애입니다

즉 webgl 빌드를 통해 만들어진 리소스들이 웹페이지에 로드가 되어야 이안에 있는 코드들이 실행이 되어지는 것입니다

 

오늘은 여기 까지 작성하고 다음시간에는  server.js 코드를 작성해보도록 하겠습니다

졸업프로젝트를 진행하면서 팀원들끼리 메타버스를 한번 만들어보자고 패기롭게

회의를 한 후 진행하면서 게임엔진과 웹을 섞어보겠다는 생각을 하다가 언리얼 엔진

webgl 을 이용하려다가 많은 자료부족에 허덕이다 중간에 유니티로 빠른 시간안에 개발하면서

배운점들을 기술해 보려고 합니다

참고로 이글에서 사용한 방법들은 저의 전문적인 지식이 없는 상태로

빠르게 프로젝트 결과물을 뽑아내기

위한 야매기법들이 다수 사용되고 있어서 기능성이 매우 떨어질 수 있습니다

 

유니티 webgl 에서 가장 핵심적인 기능이라고 할수 있는 코드 한줄이 있습니다

그것은 바로 

https://docs.unity3d.com/ScriptReference/Application.ExternalCall.html

 

Unity - Scripting API: Application.ExternalCall

ExternalCall calls functionName in the web page containing the WebGL player, passing the given arguments to it. Supported argument types are the primitive types (string, int, float, string) and arrays of such types. Any other objects are converted to strin

docs.unity3d.com

위에 설명에 보다시피 구식 api 코드입니다 지금은 새로운 api를 사용하라고 권고 하고 있습니다

이친구의 역할은 webgl로 만들어진 unity contents를 포함하고 있는 웹페이지에 매개변수로 작성해 준

함수의 이름과 또다른 매게 변수를 같이 전달해 줄 수 있습니다

 

예를들어 제가 Application.ExternalCall("socket.emit", "SENDMSG", new JSONObject(data));

유니티 C# nentwork.cs라는 곳에 이렇게 작성했으면

Application.ExternalCall("socket.emit", "SENDMSG", new JSONObject(data));

이런 식으로 코드를 작성했을 때 

웹페이지의 자바스크립트 함수인

 

저의 webgl 컨텐츠가 탑재될 webpage에서 밑의

코드를 실행하는 것이지요

socket.on('SENDMSG', function(JSONObject(data));
socket.on('SENDMSG', function(JSONObject(data));

가 실행되는 것이지요 일단 첫 글은 여기서 마무리 하도록 하겠습니다

 

https://youtu.be/NrATtJDuyUQ

이 작품이 이번 게시글에 작품입니다

+ Recent posts