IT/WebGl

[WebGL] 웹 브라우저 환경(Nuxt,React) 에서 WebGl 연결 - 3

2023. 2. 21. 10:50
오늘의 명언

“ 좋은 프로그래머는 자기 두뇌를 사용한다. 그러나 좋은 가이드라인은 모든 케이스를 고려해야만 하는 노력을 줄여준다. ”

- 프랜시스 글래스보로우 (Francis Glassborow)
목차
  1. Nuxt 에서 Unity 이벤트(함수) 실행하기
  2. Unity에서 Nuxt로 데이터 전달받기
300x250

 

 

 

[WebGL] 웹 브라우저 환경(Nuxt,React) 에서 WebGl 연결 - 2

[WebGL] 웹 브라우저 환경(Nuxt,React) 에서 WebGl 연결 - 1 Unity WebGL 이란? Unity 콘텐츠를 HTML5 기술과 WebGL 렌더링 API를 사용하여 웹 브라우저에서 실행하는 기술. 간단하게 Unity 빌드 옵션을 사용하여 java

stack94.tistory.com

 

이전 포스팅에 이어서 Nuxt <-> 유니티에 대한 양방향 통신에 대해서 설명을 이어가겠습니다.


 

Nuxt 에서 Unity 이벤트(함수) 실행하기

 

  • 이전 포스팅에서 만들어준 EditorViewer 컴포넌트를 다시 확인해서
  • 버튼과 화면을 같이 보기 위해 canvas width 값을 줄여줍니다. 1900px -> 800px
  • Web(Nuxt)에서 유니티로 이벤트를 전달하기 위한 버튼을 생성합니다.

    
<template>
<div id="editor-container" style="display: flex">
<canvas id="canvas" style="width: 800px; height: 1000px;"></canvas>
// 추가 버튼
<v-btn @click="SendUnityCountUp">Unity 내부로 countUp</v-btn>
</div>
</template>
<script>
import UnityWebgl from 'unity-webgl';
export default {
name: "EditorViewer",
mounted() {
this.ConfigBuildEditor()
this.EditorOnLoad()
},
data:()=>({
editor:null,
}),
methods:{
// Static 폴더 Build 파일 연결
ConfigBuildEditor(){
this.editor = new UnityWebgl({
loaderUrl:
'/Build/app_web.loader.js',
dataUrl:
'/Build/app_web.data.unityweb',
frameworkUrl:
'/Build/app_web.framework.js.unityweb',
codeUrl:
'/Build/app_web.wasm.unityweb',
})
},
// Unity 콘텐츠 화면 로드
EditorOnLoad(){
this.editor
.on('progress', percent =>{
console.log('Unity Loaded: ', percent)
})
.on('created', () => {
console.log('Unity Instance created: ')
})
.on('destroyed', () => console.log('Unity Instance: Destroyed.'))
.create(document.querySelector('#canvas'))
},
// 유니티로 이벤트 전송하는 메소드
SendUnityCountUp(){
this.editor.send('GameManager','CountUp')
}
}
}
</script>

 

  • Web Unity 콘텐츠 화면

 

 

  • Unity Hirerachy에서 스크립트가 연결된 GameManager를 확인합니다.

 

  • GameManager에 연결된 GameManager 스크립트를 확인하면
  • CountUp이라는 함수를 확인할 수 있습니다.

 

중요

Tip

Web(Nuxt)에 버튼에서  유니티 콘텐츠에 함수를 실행하려면
Hierarchy - GameManager에 연결된 GameManager 함수인 CountUp을 실행하면 됩니다.


    
// methods
SendUnityCountUp(){
this.editor.send('GameManager','CountUp')
}

 

"Unity 내부로 COUNTUP"이라는 버튼을 클릭 시 아래처럼 카운트가 증가하는 것을 볼 수 있습니다,

 


 

Unity에서 Nuxt로 데이터 전달받기

 

  • Unity Assets - Plugins - WebGL 폴더 안에 jslib파일을 생성합니다. (메모장으로 확장자 jslib 넣어서 만들어도 됩니다.)

 


    
// webglLibrary.jslib 파일
mergeInto(LibraryManager.library, {
// 함수명
SendData: function (score) {
console.log("SendData ",score);
// 중요!! __UnityLib__.함수명(data)를 작성해야 Web에서 이벤트 수신 가능
__UnityLib__.SendData(score);
return score;
},
});

 

  • Unity - jslib 파일 - inspector 창을 보면 아래와 같이 세팅합니다.  (파일 클릭 후 오른쪽화면입니다)

 

  • Unity - Assets - Script - GameManager에서 jslib을 연결합니다. (C#에서 dll 파일 불러오는 거랑 같습니다)

    
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using System.Runtime.InteropServices; //추가
public class GameManager : MonoBehaviour
{
// jslib 함수명
[DllImport("__Internal")]
public static extern void SendData(int score);
public Text testText;
public int score = 0;
public void CountUp()
{
score +=1;
testText.text = score.ToString();
libCall() //연결
}
// jslib 함수
public void libCall()
{
#if UNITY_WEBGL == true && UNITY_EDITOR ==false
SendData(score);
#endif
}
void Start(){}
void Update(){}
}

 

  • jslib 파일과 GameManager 스크립트에 연결을 완료했으면, Unity 프로젝트를 다시 빌드합니다.
  • 빌드파일을 기존에 있던 Nuxt - static - Build 파일을 교체합니다.
  • Nuxt 프로젝트에서 EditorViewer - EditorOnLoad 메소드에 jslib에서 작성한 함수명을 등록합니다.

    
// methods
EditorOnLoad(){
this.editor
.on('progress', percent =>{
console.log('Unity Loaded: ', percent)
})
.on('created', () => {
console.log('Unity Instance created: ')
})
// unity 함수 등록
.on('SendData', (score) => {
console.log('Count : ',score)
})
.on('destroyed', () => console.log('Unity Instance: Destroyed.'))
.create(document.querySelector('#canvas'))
},

 

  • Nuxt 실행하면 화면과 같이 로그가 찍히는 걸 볼 수 있습니다.

 

 


여기까지 Nuxt와 Unity WebGL에 관해서 양방향 통신에 대한 내용으로 기본적인 데이터 주고받는 부분을 활용해서 웹에서 간단한 모델을 띄워서 에디팅 할 수도 있고, 여러 가지 다양한 콘텐츠를 만들어볼 수 있습니다. 

리액트로 Nuxt와 비슷하게  react-unity-webgl이라는 라이브러리를 써서 위와 같이 구현할 수 있습니다. 추후 기회가 되면 React WebGl에 대해서도 작성해 보겠습니다. 그러면 WebGL 관련 포스팅은 여기까지로 마무리하겠습니다. 

감사합니다.

 

 

틀린 부분이나 수정되어야 할부분은 댓글로 남겨주세요. 

읽어주셔서 감사합니다.

 

 

 

 

 

반응형
저작자표시 비영리 변경금지 (새창열림)
잘못된 내용이 있으면 댓글 부탁드립니다. 감사합니다.
Stack_Shines
Stack_Shines
프론트엔드 백엔드 학습정리 및 정보공유 블로그입니다.
'IT/WebGl' 카테고리의 다른 글
  • [WebGL] Unity WebGL Brotli 압축에 대한 Nginx 서버 설정
  • [WebGL] 웹 브라우저 환경(Nuxt,React) 에서 WebGl 연결 - 2
  • [WebGL] 웹 브라우저 환경(Nuxt,React) 에서 WebGl 연결 - 1
Stack_Shines
느린 개발자
Stack_Shines
전체
오늘
어제
  • 분류 전체보기 102
    • 티스토리 10
    • IT 67
      • Library 3
      • JavaScript 3
      • TypeScript 3
      • Nuxt & vue 14
      • Nuxt3 6
      • React 4
      • NestJS 4
      • Express 9
      • CI CD 1
      • WebGl 4
      • docker 6
      • MAC 2
      • 디자인패턴 1
      • Error 4
      • 홈서버 3
    • 프로젝트 1
    • 오늘의 회고 2
    • 맛리뷰 7
    • 다이어트 5
    • 여행 1
    • 끄적끄적 일상 6
    • 생활 정보 3

인기 글

최근 글

hELLO · Designed By 정상우.
Stack_Shines
[WebGL] 웹 브라우저 환경(Nuxt,React) 에서 WebGl 연결 - 3
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.