728x90

게임개발을 해본적이 단한번도 없는데 어쩌다보니 암호화폐 관련 프로그램들을 많이 만들고

다양하게 얕고 만들고싶은것들을 개발하다가 지인을 통해 우연히 외주를 받게되었고...

모바일 바카라 비슷한 게임제작 의뢰를 받게되었다.....모바일 게임에 암호화폐 지갑까지 연동해야 될수있는데

많이 힘들고 험난할거같지만

시간은 넉넉하니 천천히 개발해볼 생각이다.완전 C#도 배워본적없이 유니티를 시작하는거라 완전 기초부터 시작할 계획이다. 개발기간은 1달내에 오픈베타를 배포하는게 목표이고, 12월까지 최종배포를 하기로 하였다.

 

 

참고

https://doc.photonengine.com/ko-kr/pun/current/getting-started/pun-intro

https://www.youtube.com/watch?v=mPCNTi3Booo&list=PL3KKSXoBRRW3YE4UMnRH762vOhSHLdnpK 

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

https://mingyu0403.tistory.com/309?category=977479 

 

Photon과
연동하기 

https://dashboard.photonengine.com/en-US/ 

위 링크 포톤서버홈페이지에 접속하여 회원가입후 CRERATE A NEW APP을 통해 APP을 하나 만들어준다.

)무료버전이라 CCU는 20이라고 함). 우선 App-ID를 복사해놓는다

 

 

그리고 유니티 Asset 스토어에서 PUN2 -FREE를 다운로드 and Import 해준다.

 

 

Appid or email에는 아까 Photon서버에서 만든 app id를 복사 붙여넣기 해준후

Setup Project해주고 조금만 기다려주면 유니티와 연동이 된다.

 

실습 포톤서버와 연결하기

 

우선 화면을 다음과같이 구성해보았다.

 

꼭 필요한건  Text이다. 버튼은 이번실습에서 필요하지않고  다음 실습에서 다른화면으로 넘어가기위해(방입장) 미리 만들어놓았다.

 

화면을 다음과 같이 구성하였다면

 

 

 

NetworkManager라는 C#도 하나 만들어준다.

실습코드는 다음과 같습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;
 
public class NetworkManager : MonoBehaviourPunCallbacks
{
    string gameVersion = "1";
    public Text statusText;
    public string nick, roomname;
    public string connect_status;
 
 
    private void Awake()
    {
        PhotonNetwork.AutomaticallySyncScene = true;
        //스터 클라이언트와 일반 클라이언트들이 레벨을 동기화할지 결정한다.
        //true로 설정하면 마스터 클라에서 LoadLevel()로 레벨을 변경하면 모든 클라이언트들이 자동으로 동일한 레벨을 로드.
 
 
    }
 
    // Start is called before the first frame update
    void Start()
    {
        Connect();
    }
 
    // Update is called once per frame
    void Update()
    {
        
        statusText.text = PhotonNetwork.NetworkClientState.ToString();
    }
 
    public void Connect()
    {
 
        if (PhotonNetwork.IsConnected)
        {
            print("PhotonNetwork.IsConnected");
        }
        else
        {
            PhotonNetwork.GameVersion = gameVersion;
            PhotonNetwork.ConnectUsingSettings(); //Photon Online Server에 접속하기 가장 중요
        }
}
cs
 

 

 

 

콜백함수 정리

본인만의 코드를 통해 직접 Consol창에 찍어보면서 어떻게 호출되는지 학습하는게 좋을듯하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.UI;
 
public class NetworkManager : MonoBehaviourPunCallbacks
{
    string gameVersion = "1";
    public Text statusText;
    public string nick, roomname;
    public string connect_status;
 
 
    private void Awake()
    {
        print("awake");
        PhotonNetwork.AutomaticallySyncScene = true;
        //스터 클라이언트와 일반 클라이언트들이 레벨을 동기화할지 결정한다.
        //true로 설정하면 마스터 클라에서 LoadLevel()로 레벨을 변경하면 모든 클라이언트들이 자동으로 동일한 레벨을 로드.
 
 
    }
 
    // Start is called before the first frame update
    void Start()
    {
        print("start");
        Connect();
    }
 
    // Update is called once per frame
    void Update()
    {
        
        statusText.text = PhotonNetwork.NetworkClientState.ToString();
    }
 
    public void Connect()
    {
 
        if (PhotonNetwork.IsConnected)
        {
            print("PhotonNetwork.IsConnected");
        }
        else
        {
            PhotonNetwork.GameVersion = gameVersion;
            PhotonNetwork.ConnectUsingSettings(); //Photon Online Server에 접속하기 가장 중요
        }
 
 
    }
    public void Disconnect()
    {
        PhotonNetwork.Disconnect();
    }
    public void JoinLobby()
    {
        PhotonNetwork.JoinLobby();
    }
    public void CreateRoom()
    {
        // 방 생성하고, 참가.
        // 방 이름, 최대 플레이어 수, 비공개 등을 지정 가능.
        roomname = "room1";
        PhotonNetwork.CreateRoom(roomname, new RoomOptions { MaxPlayers = 6 });
    }
    public void JoinRoom()
    {
        // 방 참가하기.
        // 방 이름으로 입장 가능.
        PhotonNetwork.JoinRoom("room1");
    }
    public void JoinOrCreateRoom()
    {
        // 방 참가하는데, 방이 없으면 생성하고 참가.
        PhotonNetwork.JoinOrCreateRoom("room1"new RoomOptions { MaxPlayers = 6}, null);
    }
 
    //콜백함수들 
 
    //포톤 온라인 서버에 접속하면 불리는 콜백함수
    //PhotonNetwork.ConnectUsingSettings()가 성공하면 호출됨
    public override void OnConnectedToMaster()
    {
        print("서버 접속 완료.");
 
        // 현재 플레이어 닉네임 설정.
        nick = Random.Range(1100).ToString();
        PhotonNetwork.LocalPlayer.NickName = nick;
        
    }
 
    //연결이 끊기면 불리는 콜백함수
    //PhotonNetwork.Disconnect()가 성공하면 불린다.
    public override void OnDisconnected(DisconnectCause cause)
    {
        print("연결 끊김 누가? ->" + nick);
    }
 
    //로비에 접속하면 불리는 콜백함수
    //PhotonNetwork.JoinLobby()가 성공하면 호출됨
    public override void OnJoinedLobby()
    {
        base.OnJoinedLobby();
        {
            print("로비접속완료 누가? ->" + nick);
        }
    }
    // 방 생성하면 불리는 콜백 함수.
    // PhotonNetwork.CreateRoom()가 성공하면 불린다.
    public override void OnCreatedRoom()
    {
        print("방 만들기 완료 누가? ->" + nick);
        print("방 이름은 ? ->" + roomname);
    }
 
    /// 방 참가하면 불리는 콜백 함수.
    /// PhotonNetwork.CreateRoom(), PhotonNetwork.JoinedRoom()가 성공하면 불린다.
    public override void OnJoinedRoom()
    {
        print("방 참가완료 누가? ->" + nick);
        print("방 이름은 ? ->" + roomname);
    }
 
    //방생성 실패시 불리는 콜백함수
    //PhotonNetwork.CreateRoom()를 호출할때 이름이 같은 방이있ㅎ으면 실패할수있다.
    public override void OnCreateRoomFailed(short returnCode, string message)
    {
        print("방만들기 실패 " + message);
    }
 
    //방참가 실패시 호출되는 콜백함수
    //PhotonNetwork.JoinRoom()할때 방인원수가 꽉차있으면 실패,아래함수가 호출될수있다.
    public override void OnJoinRoomFailed(short returnCode, string message)
    {
        print("방 참가 실패.");
    }
 
    /// 방 랜덤 참가 실패하면 불리는 콜백 함수.
    /// PhotonNetwork.JoinRandomRoom()를 호출할 때, 방 인원수가 모두 차있거나 존재하지 않으면 실패할 수 있다.
    /// 다른 사람이 더 빠르게 들어갔거나, 방을 닫았을 수 있다.
 
    public override void OnJoinRandomFailed(short returnCode, string message)
    {
        print("방 랜덤 참가 실패.");
    }
}
 
cs

 

 

 

결과

c#코드를 모두 작성하였고 NetworkManager에 ADD COMPONENT  해줬다면 실습에서 콘솔에 다음과같이 뜰것이다.

 

작동과정을보면

1. Awake() 함수 PhotonNetwork.AutomaticallySyncScene = true;

//스터 클라이언트와 일반 클라이언트들이 레벨을 동기화할지 결정한다.

 

2. void Start()  -> Connect()

 

3.     public void Connect() 에서 if문이 거짓이므로(포톤서버와 연결이 안되있으므로) 

PhotonNetwork.GameVersion = gameVersion;
PhotonNetwork.ConnectUsingSettings(); 가 호출되고

 

4. PhotonNetwork.ConnectUsingSettings()가 성공하면 콜백함수    public override void OnConnectedToMaster() 가 호출됨

 

print("서버 접속 완료.");
// 현재 플레이어 닉네임 설정.
nick = Random.Range(1, 100).ToString();
PhotonNetwork.LocalPlayer.NickName = nick;

 

느낀점

유니티에서 사용되는 스크립트  C#언어를 사용해본적이 한번도 없는데

C#언어를 사용하는게 엄청 익숙하다.그러나  유니티 게임엔진을 이용하는게 아직 많이 어렵고 

부자연스럽다.. 오늘이 유니티학습 2일차인데, 유니티게임개발같은 경우 한국어

구글 자료가 좀 적은거같다고 느꼈다. 유니티 엔진을 좀더 자연스럽게 이용하기 위해 새벽에 

2D 점프게임 + 바카라 게임을 만들어봤다.

엄청 조잡하고 애니메이션효과도 하나도없지만 나름 재미있게 학습한거같다.( 이부분은 블로그에 포스팅하지않을거같다.

즉흥적으로 만든거라....)

 

포톤서버에 비용에대해 궁금해서 알아봤는데..

무료 포톤서버라 CCU(동시접속?)이 20명밖에 안된다고 한다.

동시접속 2000CCU가 월60만원 정도 하는거같다.

 

 

 

아래는 개별적으로 2D 위로 점프하는게임을 개발하면서 적은 메모장(낮과밤에는 내 프로젝트 관련된 유니티 프로젝트를 개발하고 , 그날 피곤하지않다면 내가 만들고싶은 간단한 게임을 만들면서 유니티와 친해져볼 생각이다.)

 

<< 게임 정리 >>

0. 화면에 객체(캐릭터) 등장
1. (클릭시) 객체를 일정높이까지 점프
2. 양쪽에서 발판들이 몰려온다
3. 아래에서 용암이 올라온다
4. 객체가 발판위에 안착하면 SCORE가 +1이 되고 SCORE에 점수가 갱신된다.

<< 필기 >>

'Scene' -> 작업하는 공간
'Game' -> 게임을 플레이할때 보이게 되는 화면

'Hierarchy' -> 장면에 등장하는 객체들 


Insperctor -> Transform 위치(T
                 ㄴ>  Component(Sprite Rendere ) : 기능

(객체 점프이벤트) 
1. 마우스 클릭이벤트를 인식 (클릭이벤트 리스너)
2. 클릭하면 어떠한 반응이 일어남
3. 주인공을 점푸할수 있는 상태로 만든다.
4. 주인공이 서있을 수 있는 바닥을 만든다.\

객체가 점프를 하기위해 객체에게 '질량' 을 부여하고
객체에게 '중력'을 부여하고 특정 이벤트 발생시
'하늘방향으로 힘을 가한다' 

Rigidbody 2d 컴포넌트는 트랜스폼을 오버라이드하고 
(부모 클래스로부터 상속받은 메소드를 재정의)

body type 에는 세가지 옵션
Dynamic : 동적
Kinematic 은 2d 시뮬레이션 상태에서,매우 명확한 사용자 제어 하에서 움직이도록 디자인되어있다.
Dynamic은 중력과 힘의 영향을 받음, 서로에게 영향을 미칠수 있음
Kinematic은 영향을 받지않는다.
Static은 전혀 움직이지 않도록 디자인 되었다.

2D(Colider2D)는 육체간의 충돌이 가능하게 해줌

★ GetComponent<Rigidbody2D>().AddForce(new Vector2(0, 200.0f)) ★

구성요소(Componenent)의 육체(Rigidbody2D)를 가져와서 힘을가한다. 
어디로? > new Vector2(0,200,0f)방향으로 

<<문법>>

C#에서 다른클래스로 상속하려면 클래스 뒤에 : (콜론)을 추가하고 상속하려는 클래스명을 써주면됨

Square 객체클릭 -> Add Component -> New Script

스크립트(C#) 파일명을 Jump.cs

public class Jump : MonoBehaviour
{
    private void Update()
    {
        if(Input.GetMouseButtonDown(0) == true)
        {
            Debug.Log("마우스 클릭 발생");
        }
    }
}

Input.GetMouseButtonDown(0) == true
if parameter == 0    -> 좌클릭
if parameter == 1   -> 우클릭
if parameter ==2     -> 휠버튼 
누른순간 true로 변환되며 아무것도 안했을때
기본적으로 false로 구분됨

<점프 하기> 위해서 Square 객체에게 Component를 추가해주는데 컴퍼넌트는 'rigidbody 2d' 를 추가해준다.

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ


text 바꾸기(ui: TextMeshProUGUI) 

public GameObject text1;
text1 연결
text1.GetComponent<TMPro.TextMeshProUGUI>().text ="123"

ㅡㅡㅡㅡㅡㅡㅡㅡ
포톤서버 APP-ID : 

이미지에서 Filter Mode를 Point로 하면 픽셀이 깨지지않고
Compression을 None로 하면 색이 번지지않음

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
서버/네트워크 프로그래밍
Mirror Mirage 네트워크라이브러리

728x90

+ Recent posts