유니티 포톤 IsMine - yuniti poton IsMine

멀티 포톤을 사용할 것이다.

유니티 포톤 IsMine - yuniti poton IsMine

좀비 멀티플레이어 폴더를 유니티에서 애드로 연다.

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

어셋 스토어 들어가기

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

로비 씬 열어주고, 비율 바꿔주고,

PUN2 를 어셋 스토어에서 다운 받아준다.

유니티 포톤 IsMine - yuniti poton IsMine

PUN2 검색해서 저거 다운 받기 

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

임포트 되면 오류는 사라지고, 포톤 위자드 창 하나가 뜬다.

포톤 페이지

로그인하고

유니티 포톤 IsMine - yuniti poton IsMine

관리화면

유니티 포톤 IsMine - yuniti poton IsMine

새 어플 만들기

유니티 포톤 IsMine - yuniti poton IsMine

새 어플 만들기

무료는 최대 20명까지 동시접속 가능

유니티 포톤 IsMine - yuniti poton IsMine

어플리케이션 ID 가 생긴다.

유니티 포톤 IsMine - yuniti poton IsMine

유니티에서 앱아이디 붙여넣어주고, 셋업 프로젝트해준다.

유니티 포톤 IsMine - yuniti poton IsMine

done 나오면 된것

그리고 닫아준다.

유니티 포톤 IsMine - yuniti poton IsMine

네트워크 세계부터 보면 좋음

유니티 포톤 IsMine - yuniti poton IsMine

4개의 세계가 있음

유니티 포톤 IsMine - yuniti poton IsMine

동기화란, 4개의 클라이언트에 오브젝트가 다 똑같이 보여야한다는 것

유니티 포톤 IsMine - yuniti poton IsMine

A클라 a와 B 클라의 a 는 동일한 식별자로 부여한다.

유니티 포톤 IsMine - yuniti poton IsMine

네트워크가 끊키면 다른 a로 취급댐

유니티 포톤 IsMine - yuniti poton IsMine

로컬 오브젝트 -> 주도권이 나에게

리모트 오브젝트 -> 주도권이 네트워크 타인에게 있음

유니티 포톤 IsMine - yuniti poton IsMine

 게임 오브젝트는 동일한 컴포넌트를 가지지만,

로컬 권한을 가지고 있는지 검사해서, 내가 움직이게 할 수 있다.

유니티 포톤 IsMine - yuniti poton IsMine

방장이 알수 있게해서, 방장이 권한을 내릴수 있게하자.

이떄 방장 권한 관련해서 우리가 사용하는건

RPC 프로토콜임

유니티 포톤 IsMine - yuniti poton IsMine

클라가

1 RPC를 통해서 어떤걸 호출함

2 어떤걸 실행을 하고

3 결과를 RPC를 통해서 모든 클라에게 뿌려주고,

호스트도 받는다.

---

유니티 포톤 IsMine - yuniti poton IsMine

로비 매니저 스크립터 열기

유니티 포톤 IsMine - yuniti poton IsMine

마스터 서버가 존재함 (로비라는 존재임)

큰 마스터 서버에 접속을 하고 

a b c 가 들어오고, 룸을 만든다..

유니티 포톤 IsMine - yuniti poton IsMine

1 그래서 먼저 마스터 서버에 접속을 해야함 

2 룸을 만들든가. 들어가든가 해야함

https://doc.photonengine.com/ko-kr/pun/current/demos-and-tutorials/pun-basics-tutorial/lobby

1 - 로비 | Photon Engine

Photon Quantum 혁신적인 멀티플레이 게임 개발에 도전! MOBA, 브라울러, RTS, 격투, 스포츠게임을 신속한 예측 네트워크 엔진으로 개발할 수 있습니다.

doc.photonengine.com

이 도큐먼터리에 자세히 나와있기도함

----

마스터 서버 접속하기

유니티 포톤 IsMine - yuniti poton IsMine

게임 버전을 맞춰주고,

PhotonNetwork.ConnectUsingSettings(); 해주면 마스터 풀에 접속한다.

유니티 포톤 IsMine - yuniti poton IsMine

버튼을 비활성화해주고,

text를 내보내준다.

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

얘는 모노비헤이어펀 콜백을 상속받음

콜백이 정말 많음

이런 콜백중에 

유니티 포톤 IsMine - yuniti poton IsMine

접속 성공시 콜백

실패시 콜백들임

유니티 포톤 IsMine - yuniti poton IsMine

접속 성공시

UI 상 룸 조인 버튼 켜주는 것

텍스트 내보내기

실패시 

룸 조인버튼 비활성화하고,

다시 접속하게 하기

\n는 띄어쓰기임

using Photon.Pun; // 유니티용 포톤 컴포넌트들
using Photon.Realtime; // 포톤 서비스 관련 라이브러리
using UnityEngine;
using UnityEngine.UI;

// 마스터(매치 메이킹) 서버와 룸 접속을 담당
public class LobbyManager : MonoBehaviourPunCallbacks {
    private string gameVersion = "1"; // 게임 버전

    public Text connectionInfoText; // 네트워크 정보를 표시할 텍스트
    public Button joinButton; // 룸 접속 버튼

    // 게임 실행과 동시에 마스터 서버 접속 시도
    private void Start() {

        //접속에 필요한 정보 (게임 버전) 설정
        PhotonNetwork.GameVersion = this.gameVersion;
        //설정한 정보로 마스터 서버 접속 시도
        PhotonNetwork.ConnectUsingSettings();


        this.joinButton.interactable = false;
        this.connectionInfoText.text = "마스터 서버에 접속중...";
    }

    // 마스터 서버 접속 성공시 자동 실행
    public override void OnConnectedToMaster() {
        this.joinButton.interactable = true;
        this.connectionInfoText.text = "온라인 : 마스터 서버와 연결 됨";
    }

    // 마스터 서버 접속 실패시 자동 실행
    public override void OnDisconnected(DisconnectCause cause) {
        this.joinButton.interactable = false;
        this.connectionInfoText.text = "오프라인 : 마스터 서버와 연결되지 않음\n 접속 재시도중... ";
        //설정한 정보로 마스터 서버 접속 시도
        PhotonNetwork.ConnectUsingSettings();
    }
유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

접속 되면 이렇게 조인 버튼이 온 된다.

유니티 포톤 IsMine - yuniti poton IsMine

접속 된 상태는 마스터 서버에 a 가 접속해 있는 상태임

만약 마스터 서버에 접속 할수 없을때 문제점은 이러하다

https://doc-api.photonengine.com/en/pun/v2/class_photon_1_1_pun_1_1_photon_network.html#afe79d7b335a4c0dd6d3ed4b3314c7c58

Photon Unity Networking 2: PhotonNetwork Class Reference

The main class to use the PhotonNetwork plugin. This class is static. More... static bool ConnectUsingSettings ()  Connect to Photon as configured in the PhotonServerSettings file. More...   static bool ConnectUsingSettings (AppSettings appSettings, bo

doc-api.photonengine.com

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

포톤 서버 세팅에 세팅이 있 고, 

Dev Region이 있다.

-----

마스터 접속 후

유니티 포톤 IsMine - yuniti poton IsMine

마스터 서버에 접속을 했다면

커넥트 메서드를 통해서

룸을 만들거나, 접속하거나, 랜덤으로, 등등 할 수있음

유니티 포톤 IsMine - yuniti poton IsMine

조인 랜덤룸 or Create 는 랜덤 품으로 접속하는데 방이 없으면 만들어준다.

조인 랜덤 룸은 랜덤품에 그냥 접속하는 것임

만약 랜덤룸이 없으면

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

매개변수 넣을수 있는 것

여기로 콜백인 들어와 진다.

방이름은 null , 옵션에 플레이어 숫자는 4명

유니티 포톤 IsMine - yuniti poton IsMine

방 참가가 완료되면

유니티 포톤 IsMine - yuniti poton IsMine

PhotonNetwork.LoadLevel("Main"); 를 이용해서 씬을 로드할 수있음

방에 있는 사람들 모두 이 씬을 로드하도록함

using Photon.Pun; // 유니티용 포톤 컴포넌트들
using Photon.Realtime; // 포톤 서비스 관련 라이브러리
using UnityEngine;
using UnityEngine.UI;

// 마스터(매치 메이킹) 서버와 룸 접속을 담당
public class LobbyManager : MonoBehaviourPunCallbacks {
    private string gameVersion = "1"; // 게임 버전

    public Text connectionInfoText; // 네트워크 정보를 표시할 텍스트
    public Button joinButton; // 룸 접속 버튼

    // 게임 실행과 동시에 마스터 서버 접속 시도
    private void Start() {

        //접속에 필요한 정보 (게임 버전) 설정
        PhotonNetwork.GameVersion = this.gameVersion;
        //설정한 정보로 마스터 서버 접속 시도
        PhotonNetwork.ConnectUsingSettings();


        this.joinButton.interactable = false;
        this.connectionInfoText.text = "마스터 서버에 접속중...";
    }

    // 마스터 서버 접속 성공시 자동 실행
    public override void OnConnectedToMaster() {
        this.joinButton.interactable = true;
        this.connectionInfoText.text = "온라인 : 마스터 서버와 연결 됨";
    }

    // 마스터 서버 접속 실패시 자동 실행
    public override void OnDisconnected(DisconnectCause cause) {
        this.joinButton.interactable = false;
        this.connectionInfoText.text = "오프라인 : 마스터 서버와 연결되지 않음\n 접속 재시도중... ";
        //설정한 정보로 마스터 서버 접속 시도
        PhotonNetwork.ConnectUsingSettings();
    }

    // 룸 접속 시도
    public void Connect() {
        // 중복 접속 막기
        this.joinButton.interactable = false;

        // 마스터 서버에 접속 중이라면
        if (PhotonNetwork.IsConnected)
        {

            //룸에 접속한다.
            this.connectionInfoText.text = "룸에 접속....";
            PhotonNetwork.JoinRandomRoom();
        }
        else {
            this.connectionInfoText.text = "오프라인 : 마스터 서버와 연결 끊킴 \n 다시 접속 시도합니다.";
            //설정한 정보로 마스터 서버 접속 시도
            PhotonNetwork.ConnectUsingSettings();
        }
    }

    // (빈 방이 없어)랜덤 룸 참가에 실패한 경우 자동 실행
    public override void OnJoinRandomFailed(short returnCode, string message) {
        this.connectionInfoText.text = "빈 방 없음, 새로운방 생성...";
        //최대 인원을 4명으로 설정 + 방을 만듦
        //방이름 , 4명 설정
        PhotonNetwork.CreateRoom(null, new RoomOptions { MaxPlayers = 4 });

    }

    // 룸에 참가 완료된 경우 자동 실행
    public override void OnJoinedRoom() {
        this.connectionInfoText.text = "방 참가 성공!";

        //모든 룸 참가자가 Main 씬을 로드하게 함
        PhotonNetwork.LoadLevel("Main");
    }
}

지금까지한건

-> 마스터 서버에 참가

-> 방에 랜덤 접속

-> 있으면 참가

-> 없으면 만들기

-> 방에 접속한 모든 사람들 LoadLevel 함

유니티에서 플레이하면 메인씬으로 넘어옴

------

메인씬로드해서 

유니티 포톤 IsMine - yuniti poton IsMine

플레이어 캐릭터를 가져다 놓기

유니티 포톤 IsMine - yuniti poton IsMine

게임내에서 동기화 되는 오브젝트는 무조건

포톤 뷰 스크립터를 가지고 있어야하낟.

유니티 포톤 IsMine - yuniti poton IsMine

옵저벼 컴포넌트에는 관찰될 컴포넌트를 넣어줘야한다.

애니메이션과 위치값을 넣어줌

유니티 포톤 IsMine - yuniti poton IsMine

저 스크립터를 오브젝트에 달아준다.

카메라 셋업

유니티 포톤 IsMine - yuniti poton IsMine

스크립터 열기

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

시네머신이 내가 권한을 가지고있는 캐릭터를 카메라로 비추고해야한다.

이걸 안하면 새로운 사람이 오면 다른 플레이어의 카메라가 셋업이 막 섞인다.

그래서 내 것만 카메라가 따라가게 한다.

인풋도 똑같이 내 로컬 플레이어만 움직여야한다.

유니티 포톤 IsMine - yuniti poton IsMine

인풋 열어주기

유니티 포톤 IsMine - yuniti poton IsMine

내것이 아니면 리턴하게 한다.

유니티 포톤 IsMine - yuniti poton IsMine

이동도 마찬가지

유니티 포톤 IsMine - yuniti poton IsMine

내 것만 움직이게한다.

플레이 슈터도

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

내 것이 아니면 리턴한다.

플레이어 헬스 스크립터를 본다.

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

Living Entity 를 f12 눌러서 봐본다.

유니티 포톤 IsMine - yuniti poton IsMine

[PunRPC] 가 붙어있다.

유니티 포톤 IsMine - yuniti poton IsMine

이것도 호스트에서 먼저 실행되고, 

호스트를 통해서 다른 클라에게 실행된다.

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

RPC 타겟에 들어와보면, 타겟들이 있다.

즉 동기화를 할때는 RPC 메서드를 사용한다.

유니티 포톤 IsMine - yuniti poton IsMine

호스트의 값을 다른 클라이언트에 동기화 시키는 것이라고 보면 됌!

------

유니티 포톤 IsMine - yuniti poton IsMine

리소스에 5가지를 넣어준다.

아까 메인에 넣은 플레이어 캐릭터 지워주고,

유니티 포톤 IsMine - yuniti poton IsMine

PC로 그냥 빌드해보기

유니티 포톤 IsMine - yuniti poton IsMine

클라이어튼 두 개를 열어서 조인해보면

유니티 포톤 IsMine - yuniti poton IsMine

접속이 2명이 된다.

동기화가 잘 되는 걸 확인할 수있다.

----

씬을 새로 만들어준다.

유니티 포톤 IsMine - yuniti poton IsMine

내 이니셜 폴더 만들고

LobbyScene을 ㅗ저장하기

스크립터 폴더 내 이니셜로 새로 만들고 

LobbyMain 스크립터 만들기

유니티 포톤 IsMine - yuniti poton IsMine

빈 오브젝트 LobbyScene 으로 만들어서 스크립터 넣어주기

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

UI 세팅해주기

유니티 포톤 IsMine - yuniti poton IsMine

로비 메인 스크립터 수정

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using Photon.Pun;
using Photon.Realtime;

public class LobbyMain : MonoBehaviourPunCallbacks
{
    public Button btnConnectMaster;

    private void Awake()
    {
        PhotonNetwork.GameVersion = "1";
    }

    // Start is called before the first frame update
    void Start()
    {
        this.btnConnectMaster.onClick.AddListener(() => {
            PhotonNetwork.ConnectUsingSettings();
        });
    }

    public override void OnConnectedToMaster()
    {
        //마스터 서버에 접속 성공     
        PhotonNetwork.JoinRandomRoom();
    }

    public override void OnDisconnected(DisconnectCause cause)
    {
        //마스터 서버 접속 실패 
        PhotonNetwork.ConnectUsingSettings();   //재접속 
    }

    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        //방 참가 실패 
        PhotonNetwork.CreateRoom("Test", new RoomOptions { MaxPlayers = 4 });
    }

    public override void OnJoinedRoom()
    {
        //방 참가 성공 
        //방에 참가한 모든 클라이언트가 GameScene을 로드 함 
        PhotonNetwork.LoadLevel("GameScene");
    }
}

게임 씬 새로 만들어주기

유니티 포톤 IsMine - yuniti poton IsMine

그냥 텍스트만 있는 게임씬 만들기

들어오는지만 테스트 할 거라서

로비 씬에서

유니티 포톤 IsMine - yuniti poton IsMine

버튼 넣고

플레이하면

버튼 누르면 게임씬으로 넘어가진다.

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

게임씬에서 플레이어 캐릭터 가져오기

리소스에있던거

유니티 포톤 IsMine - yuniti poton IsMine

나머지는 일단 지워주고, 움직이기만 해보자

유니티 포톤 IsMine - yuniti poton IsMine

컴포넌트를 애니메이션 빼고 다 지움

우리가 넣어줄것이다.

유니티 포톤 IsMine - yuniti poton IsMine

저 캐릭터를 프리팹을 시켜준다.

GameMain 스크립터와 빈 오브젝트를 GameMain으로 바꿔주고, 스크립터를 넣어준다.

GameMain 스크립터 

유니티 포톤 IsMine - yuniti poton IsMine
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
public class GameMain : MonoBehaviour
{
    public GameObject heroPrefab;
    // Start is called before the first frame update
    void Start()
    {
        PhotonNetwork.Instantiate(this.heroPrefab.name, Vector3.zero, Quaternion.identity);
    }

    // Update is called once per frame
    void Update()
    {
        
    }
}

프리팹해주는 코드를 넣어준다.

유니티 포톤 IsMine - yuniti poton IsMine

히어로 프리팹에 Photon View 스크립터를 달아야한다.

유니티 포톤 IsMine - yuniti poton IsMine

GameMain의 스크립터에 프리팹 넣어주고,

로비에서 실행해본다.

유니티 포톤 IsMine - yuniti poton IsMine

캐릭터가 프리팹해서 나온다.

유니티 포톤 IsMine - yuniti poton IsMine

씬 넣고 빌드해보자

유니티 포톤 IsMine - yuniti poton IsMine

클라 두 개 띄우면

내 캐릭터에는 IsMine이 체크가 되어있다.

이걸로 판명하는 것 ! 

----

Hero 스크립터 만들어서 움직이게하고,

Ismine이 내것이 아니라면 리턴하게함

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class Hero : MonoBehaviourPun
{
    private Animator anim;
    private Vector3 eulerAngles;

    private void Awake()
    {
        this.anim = this.GetComponent<Animator>();
    }

    private void Update()
    {
        if (!this.photonView.IsMine) return;

        var h = Input.GetAxisRaw("Horizontal");
        var v = Input.GetAxisRaw("Vertical");

        if (h == 0 && v == 0)
        {
            this.anim.SetFloat("Move", 0f);
        }
        else
        {
            eulerAngles = new Vector3(0, Mathf.Atan2(h, v) * 180 / Mathf.PI, 0);
            this.transform.eulerAngles = eulerAngles;

            this.transform.Translate(Vector3.forward * 2.0f * Time.deltaTime);
            this.anim.SetFloat("Move", 1.0f);
        }
    }
}
유니티 포톤 IsMine - yuniti poton IsMine

히어로 프리팹에 넣어주기

유니티 포톤 IsMine - yuniti poton IsMine

설정을 바꿔줘야한다.

유니티 포톤 IsMine - yuniti poton IsMine

그럼 캐릭터가 움직인다.

이번에는 마우스 우 클릭시

파이어가 됌

그리고 레이를 나오게 해주자

히어로에서

유니티 포톤 IsMine - yuniti poton IsMine

파이어 위치 만들어주고ㅡ,

유니티 포톤 IsMine - yuniti poton IsMine
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;

public class Hero : MonoBehaviourPun
{
    private Animator anim;
    private Vector3 eulerAngles;
    public Transform firePivot;

    private void Awake()
    {
        this.anim = this.GetComponent<Animator>();
    }

    private void Update()
    {
        if (!this.photonView.IsMine) return;

        var h = Input.GetAxisRaw("Horizontal");
        var v = Input.GetAxisRaw("Vertical");

        if (h == 0 && v == 0)
        {
            this.anim.SetFloat("Move", 0f);
        }
        else
        {
            eulerAngles = new Vector3(0, Mathf.Atan2(h, v) * 180 / Mathf.PI, 0);
            this.transform.eulerAngles = eulerAngles;

            this.transform.Translate(Vector3.forward * 2.0f * Time.deltaTime);
            this.anim.SetFloat("Move", 1.0f);
        }

        var fire = Input.GetMouseButtonDown(0);
        if (fire) {
            Debug.Log("Fire");
            Ray ray = new Ray(this.firePivot.position, this.firePivot.forward);
            Debug.DrawRay(ray.origin, ray.direction * 1000, Color.red, 0.5f);
        }
    }
}

피봇 트랜스폼으로 받아서

레이가 나가게해준다.

유니티 포톤 IsMine - yuniti poton IsMine

적용 시켜준다.

유니티 포톤 IsMine - yuniti poton IsMine

레이를 잘 쏜다.

유니티 포톤 IsMine - yuniti poton IsMine

리지드 바디랑

리지드 바디에 그래비티 끄고

캡슐 콜라이더를 넣어주고

유니티 포톤 IsMine - yuniti poton IsMine

태그 플레이어로 되어있는지 확인하기

Hero 스크립터가기

유니티 포톤 IsMine - yuniti poton IsMine

Fire 메서드를 만들어주고,

버튼 클릭시 작동되게해준다.

쏘는걸 방장에게 처리하게 한다.

총에 맞으면 이펙터가 나오게한다.

RpcTarget이 호스트만 되어있어서 호스트만 처리한다!

유니티 포톤 IsMine - yuniti poton IsMine

레이를 맞은게 플레이어라면, 그 오브젝트가 가진 프리팹의 포톤 뷰 ID를 로그로 찍어준다.

log 찍는거니깐 유니티에서 확인 가능함, 

캐릭터가 땅으로 떨어지면 

리지드 바디 position Y 잠그거나

is 키네틱으로 해보기

빌드 후

유니티를 먼저 접속 ->  유니티가 호스트 

프로그램 실행하기

유니티 포톤 IsMine - yuniti poton IsMine

유니티가 쏘면  닿는 유닛의 ID를 로그로 찍어준다.

유니티 포톤 IsMine - yuniti poton IsMine

이건 프로그램에서 찍어본것

이펙터가 나오게한다.

유니티 포톤 IsMine - yuniti poton IsMine

닿으면  RPC로 해서 전부에게 보내준다. 

그리고 메서드를 소환하게한다.

메서드에서 포톤네트워크인스턴트를 해준다.

파티클 플레이를 해준다.

유니티 포톤 IsMine - yuniti poton IsMine

리소스 폴더에 이펙터 넣어주고

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

파티클에 포톤뷰를 달지 않아서 오류가 뜬다.

동기화가 되는건 모두 포톤뷰가 있어야한다.

유니티 포톤 IsMine - yuniti poton IsMine

그럼 이펙터가 나온다.

근데! 이펙터는 포톤네트워크.인스턴트로 모두 동기화하기보단

그냥

유니티 포톤 IsMine - yuniti poton IsMine

나오게하는 게 좋을 듯 

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

포톤뷰 떼고 해보기

동시에 나오는 것들, 아이템 이런거는 포톤네트워크.인스턴트 하는게 좋지만,

이런 이펙터는 그냥 내부적으로 각자 나오게하는게 좋다.

-----

아이템 생성하기

Coin 프리팹 생성할거임

GameMain 에서 코인 생성

유니티 포톤 IsMine - yuniti poton IsMine

꼭 포톤뷰가 달려있어야함, 그래야지 포톤뷰,인스턴트가 제대로 됌

유니티 포톤 IsMine - yuniti poton IsMine

1, 0 ,1 지점에 잘 생성이 된다.

아이템 먹을시 획득

유니티 포톤 IsMine - yuniti poton IsMine

먼저 히어로에 콜라이더에 트리거 설정해주기

유니티 포톤 IsMine - yuniti poton IsMine

코인의 태그를 코인으로 바꿔주기

히어로 cs 에서 

유니티 포톤 IsMine - yuniti poton IsMine

누가 먹었는지 뷰 아이디를 로그로 보여준다.

트리거 닿을때 코인이면

GetCoin메서드 실행, 마스터만 알게하고, othe.gameobject를 넘겨준다.

없애준다.

★게임오브젝트는 RPC를 못한다!!

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

그래서 ViewID를 보내줘서

ViewID를 지워준다!

문제! 

에디터에서 혼자 먹으면 지워지지만, 다른 클라에서 먹으면 오류가 뜸 !

유니티 포톤 IsMine - yuniti poton IsMine

이런 에러가 뜸!

이문제는 코인생성을 마스터와 일반클라 둘 다 에서 생성해서 삭제가 안되는 것

그래서 지금 마스터에서 지울려고해서 안되는 것이다.

마스터만 생성할 수 있게 해준다.

유니티 포톤 IsMine - yuniti poton IsMine

생성될 때 마스터클라만 생성시켜준다.

유니티 포톤 IsMine - yuniti poton IsMine
유니티 포톤 IsMine - yuniti poton IsMine

정상적으로 먹어진다.

생성될 때 마스터클라만 생성시켜준다.

그래서 전에는 코인이 마스터클라, 일반 클라 두 개 에서 만들어 졌음 ㅎㅎ;;

----

채팅 기능

카페에 올린거 참고