Django/Setup2020. 2. 22. 19:57

Python 설치 / PATH 환경변수 설정

 

가상환경(Vertual Environment)

한개의 가상환경은 다른 가상환경과 서로 디렉토리가 다르며 파이썬과 그 라이브러리의 버전을 달리 설치할 수 있다

 

1. 가상환경을 설치할 디렉토리 생성

django_web 등의 임의의 이름을 가진 디렉토리를 생성한다

아래의 모든 명령은 언급이 없으면 위에서 생성한 디렉토리 안에서 실행한다

 

CMD를 이용하여 특정 디렉토리로 이동하여 그 곳에 가상환경을 생성하는 명령은 다음과 같다.

python -m venv venv01    /* venv01 은 가상환경의 이름이며 해당 디렉토리가 생성된다 */

 

 

2. 가상환경의 활성화

source venv01/bin/activate

가상환경이 활성화된 후에라야 해당 가상환경에 패키지를 설치할 수 있고 가상환경에 이미 설치된 파이썬 패키지를 사용할 수가 있다

윈도우 환경에서는 'source' 를 빼고 그냥 'venv01\Scripts\activate' 명령을 사용하고,

Power Shell 을 사용한다면 Activate 첫자는 대문자('A')를 사용해야 한다

가상환경이 활성화되면 아래처럼 괄호 안에 가상환경의 이름이 표시된다

(venv01) c:\Python_Projects>  

가상환경이 활성화된 경우에만 Django 를 사용할 수 있다

 

 

필요시 가상환경의 비활성화 명령

deactivate

커맨드창을 닫으면 가상환경도 비활성화된다

 

 

3. Django 설치

가상환경이 생성되고 활성화된 디렉토리 안에서 다음과 같은 명령으로 해당 가상환경에 Django를 설치할 수 있다.

장고 2.2 버전에 맞는 mysqlclient 가 아직 없기 때문에 장고 2.1버전을 설치한다(2020.03.02현재 장고 2.2 와 mysqlclient를 연결하는 과정에서 아래와 같은 오류가 발생함)

django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have 0.9.3.

pip install django <- django 최신버전이 설치되어 mysqlclient 현재버전과 연결할 때 오류발생

 

MySQL 8 버전과 호환되는 Django 2.1을 설치할 때는 아래처럼 버전을 지정할 수 있다

pip install django==2.1

 

 

4. Django 프로젝트 생성

django-admin startproject myproj .

마지막에 있는 점(.)을 빠뜨리지 않도록 한다. 만약 빠뜨린 경우에는 가상한경 디렉토리만 남기도 모두 삭제한 후에 다시 명령을 실행한다

 

 

MySQL 설정

디폴트로 제공되는 SQLite3 데이터베이스를 사용하지 않고 MySQL 을 사용하려는 경우에는 아래처럼 변경한다

윈도우용 MySQL Client 설치(사용하는 Python 버전에 따라 적당한 설치파일 선택)

MySQL 8, Python 3.8, Django 2.1 환경일 때 아래의 방법으로 문제 없이 성공함

 

윈도우용 mysqlclient 다운로드(cp38: 파이썬 3.8의미, 설치된 Python이 32비트인지 64비트인지 확인하여 해당파일 사용). mysqlclient 설치에 실패하면 64비트 버전과 32비트 버전을 변경하여 설치하면 성공하는 경우도 있다고 함

 

 

4. 설치된 Python의 몇 비트인지 확인하는 Python명령

>>> import platform 
>>> print(platform.architecture())

 

 

5. 미리 컴파일된 mysqlclient 다운로드

https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysql-python

 

 

6. MySQL Client 설치

Downloads 폴더에 다운로드했다면, 해당 폴더로 이동하여

pip install mysqlclient-1.4.6-cp38-cp38-win32.whl

 

 

7. pymysql 모듈 설치

pymysql 모듈을 사용하는 경우

pip install pymysql

프로젝트 폴더 안의 settings.py를 열고 ...

 

 

8. settings.py 파일 내용의 맨 위에 다음과 같이 추가한다

import pymysql 
pymysql.install_as_MySQLdb()

 

 

9. settings.py 중간 약간 아랫쪽에서 다음과 같은 내용을 찾아서 아래처럼 변경한다

# Database 
https://docs.djangoproject.com/en/3.0/ref/settings/#databases 
# 디폴트 상태는 아래와 같다
DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.sqlite3', 
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), 
    } 
}

 

# MySQL을 사용하려면 위의 내용을 아래처럼 해당 데이터베이스 연결정보로 변경한다

DATABASES = { 
    'default': { 
        'ENGINE': 'django.db.backends.mysql', 
        'NAME': 'testdb', 
        'USER': 'root', 
        'PASSWORD': 'a1234', 
        'HOST': 'localhost', 
        'PORT': '3306',
    } 
}

 

 

10. cryptography 설치

pip install cryptography

 

 

11. 프로젝트를 관리할 데이터베이스 생성

python manage.py migrate

settings.py 에 설정된 데이터베이스가 생성된다

위의 과정 중에 아래처럼 오류가 발생할 수 있다

RuntimeError: cryptography is required for sha256_password or caching_sha2_password

위의 오류는 cryptography 모듈이 설치되지 않았기 때문에 발생하므로 아래처럼 설치한 다음, 위의 명령을 다시 실행한다

 

 

 

데이터베이스 생성에 성공하면 MySQL 의 지정된 DB(여기서는 testdb) 안에 10개 정도의 테이블이 생성된 것을 확인할 수 있다(MySQL Workbench 등에서 쉽게 확인)

 

 

12. 내장된 웹서버를 실행하여 프로젝트 작동상태를 웹브라우저로 확인

python manage.py runserver

(venv01) c:\Python_Projects>python manage.py runserver 
Watching for file changes with StatReloader 
Performing system checks... 

System check identified no issues (0 silenced). 
February 22, 2020 - 19:39:13 
Django version 3.0.3, using settings 'myproj.settings' 
Starting development server at http://127.0.0.1:8000/ 
Quit the server with CTRL-BREAK.

CTRL-C 를 사용해도 웹서버를 중지할 수 있다

 

 

13. 웹브라우저로 접속

http://localhost:8000

웹브라우저에 위의 URL에 접속해보면 로켓트와 아래의 문장이 보이면 성공한 것이다

The install worked successfully! Congratulations!

 

포트번호 변경

에러나 접속이 되지 않는 경우에는 8000 번 포트번호를 이미 다른 프로그램에서 사용 중일 경우가 많다. 다음과 같은 명령을 사용하여 포트번호를 변경할 수 있다

python manage.py runserver 8001

 

 

Posted by cwisky
Networking/Server Travel2020. 2. 20. 17:17

로비맵에 현제 접속 중인 모든 클라이언트들에게 동시에 게임맵으로 전환(Server Travel)하고 로비맵에서 선택한 캐릭터를 게임맵에서 스폰하는 예

 

로그인 버튼을 누르면 서버측(GameMode)에서 로그인 순서대로 플레이어에게 순번을 부여하면 클라이언트 측의 SaveGame이나 GameInstance 에 저장했다가, 2명이 모두 로그인하면 서버측(GameMode)에서는 Server Travel 명령을 실행하여 모두 클라이언트가 ThirdPersonExampleMap 으로 전환하도록 한다.

Server Travel 후에 실행되는 ThirdPersonGameMode의 OnRestartPlayer 함수에서 SaveGame 이나 GameInstance 로부터 플레이어의 순번을 참조하여 해당 번호의 캐릭터를 스폰하여 3인칭 맵 위에 표시한다

 

 

언리얼 에디터에서 3인칭 프로젝트 템플릿을 사용하여 프로젝트 생성

 

 

2개의 캐릭터 생성

  • ThirdPersonCharacter : 디폴트로 존재하는 캐릭터
  • BP_Blue : ThirdPersonCharacter를 복제하여 BodyColor 만 변경한 캐릭터

 

복제된 캐릭터의 BodyColor 를 변경하기 위해 아래의 Construction Script 참고

 

2개의 레벨 생성(아무것도 없는 Empty 레벨, 3인칭 템플릿 레벨)

  • LobbyMap : 아무것도 없는 로비용 Empty 레벨
  • ThirdPersonExampleMap  : 3인칭 프로젝트 템플릿에 포함된 게임용 레벨
  • 게임맵을 더블클릭하여 에디터에서 열고 월드아웃라이너에서 디폴트로 포함된 Network Player Start를 삭제한다
  • 언리얼 에디터 > 모드 > 배치 >검색창에 Player Start 를 검색하여 드래그하여 레벨에 필요한 플레이어 수만큼 배치한다

 

2개의 GameMode 생성

  • GM_Lobby : Use Seamless Travel 속성 체크
  • 로비맵의 GameMode에디터에서 Default Pawn Class 항목에 None 설정
  • ThirdPersonGameMode (디폴트 생성됨) : Use Seamless Travel 속성 체크
  • 게임맵의 GameMode에디터에서 Default Pawn Class 항목에 Pawn 설정

 

2개의 PlayerController 생성

  • BP_LobbyPlayerController (로비맵에서 사용될 PlayerController)
  • BP_ThirdPersonPlayerController (게임맵에서 사용될 PlayerController)
  • 프로젝트 세팅 항목에서 Editor Startup Map, Game Default MapLobbyMap으로 설정한다

 

SaveGame 블루프린트 클래스 생성(SG_PlayerNumber)

  • Player Number 정수 변수 선언

 

GameInstance 클래스 생성(BP_GameInstance)

  • 여기에서는 GameInstance에 Player Number 정수 값을 저장하여 레벨전환 후에 다시 참조할 것이므로 Player Number 라는 정수변수 1개만 선언한다
  • 프로젝트 세팅 > 맵 & 모드 > Game Instance 섹션의 Game Instance Class항목에 등록한다

 

플레이 설정

  • 언리얼 에디터 > 플레이 버튼 우측 역삼각형 > 고급세팅 > Multiplayer Options > 단일 프로세스 항목 체크해제, 에디터 멀티플레이어 모드 항목에 Play As Client 설정
  • 언리얼 에디터 > 플레이 버튼 우측 역삼각형 > 플레이어 수: 2,    독립형 게임 선택
  • 위와 같이 설정한 후에는 [플레이] 버튼만 누르면 위의 설정대로 실행된다
  • 게임이 실행되면 2개의 윈도우에 각 플레이어의 뷰가 표시되고 키보드와 마우스로 각 캐릭터를 제어할 수 있다
  • ALT + TAB 키를 누르면 제어대상 윈도우를 변경할 수 있다
  • 게임 윈도우의 종료는 ALT + TAB 키를 눌렀을 때 보여지는 섬네일 윈도우의 X 버튼을 누르면 된다
  • 한대의 컴퓨터에서 테스트하면 캐릭터가 각 플레이어마다 동일하게 스폰되므로 2대의 컴퓨터에서 테스트해야 한다
  • 패키징하여 네트워크 환경에서 서버와 클라이언트를 실행하는 방법은 여기를 참조하세요

 

WG_Login 위젯생성 (로비맵의 화면에 표시될 로그인버튼 한개만 필요)

 

 

로비맵에서 사용될 PlayerController

 

 

LobbyPlayerController의 멤버변수 Player Number변수복제 노티파이 함수의 내용

 

 

로비맵의 게임모드에서 플레이어 2명이 로그인하면 Server Travel 명령을 실행하여 게임맵(ThirdPersonExampleMap)으로 모든 접속된 클라이언트들을 전환한다

 

 

로비용 PlayerController 에서 Player Number 변수를 선언하고 변수복제(Rep Notify)를 설정한다

플레이어가 로그인 버튼을 누른면 서버측에서 로그인 순번을 지정하여 Player Number 변수에 저장하므로 Player Number 변수는 변수복제를 사용하여 클라이언트에게 복제되도록 하고 노티파이 함수(On Rep Player Number)도 실행되도록 한다. 변수가 복제되면 SaveGame 을 이용하여 Player Number값을 디스크에 저장한다.

이 값은 나중에 게임맵으로 전환될 때 게임맵의 게임모드에서 읽어들여서 해당 번호의 캐릭터를 스폰하는데 사용한다

 

 

위와 동일하지만 SaveGame이 아닌 GameInstance에 Player Number 를 저장하는 경우

 

 

게임맵의 GameMode에서는 우선 Choose Player Start 를 오버라이드하여 Player Start 위치에 캐릭터가 생성되도록 준비한다

 

 

게임맵의 GameMode에서 각 플레이어에게 캐릭터를 스폰하여 표시해줄 책임이 있으므로 아래처럼 다양한 방법으로 이전에 선택된 캐릭터를 생성한다. 여기서는 OnRestartPlayer 이벤트 함수를 오버라이드 한 예이다. 이 외에도 Spawn Default Pawn at Transform 이나 Spawn Default Pawn For 를 오버라이드하면 더 간편하게 스폰할 수 있다. 이 페이지 하단에 이들 2개 함수의 사용 예를 추가했다

위에서 사용된 Load Player Number 함수는 게임맵의 PlayerController에 정의된 커스텀 이벤트 함수이며 이 함수는 내부에서 다시 GameMode의 RequestPossess 함수를 호출할 때 자신의 Player Number를 파라미터로 전달한다. Player Number를 받은 GameMode 에서는 해당 번호의 폰을 스폰하여 Possess함수를 호출하는 내용이다

 

 

게임맵에서 사용되는 PlayerController의 전체 내용

 

 

게임맵 GameMode 의 변수 섹션에 폰 클래스 배열을 생성한다

 

 

Server Travel 실행 후 로드되는 게임맵에서 폰을 스폰하는 3가지 방법

  • Server Travel 으로 이동된 맵의 GameMode::OnPostLogin 은 실행되지 않으므로 OnRestartPlayer를 오버로드한다
  • OnRestartPlayer를 오버로드할 때는 스폰 후에 Possess함수를 호출해야 한다
  • OnRestartPlayer를 사용하지 않으려면 Spawn Default Pawn at Transform 이나 Spawn Default Pawn For 를 오버라이드하면 된다. 2개의 함수 모두 OnRestartPlayer보다 간편하고 Possess를 호출할 필요가 없다.
  • OnRestartPlayer 실행 후에 Spawn Default Pawn at Transform 이나 Spawn Default Pawn For 가 자동으로 호출된다. 그러므로 이들 3개 중 한개의 함수만 오버로드하여 폰을 스폰해주면 된다

 

OnRestartPlayer 를 오버로드하여 게임맵에 스폰하는 예

 

게임맵의 GameMode에서 Spawn Default Pawn at Transform 오버로드(GameInstance이용하는 버전)

Spawn Default Pawn at Transform 은 OnRestartPlayer 이후에 자동으로 호출되며 Possess 함수는 사용할 필요 없다

 

위와 동일한 함수이며 SaveGame을 이용하는 버전

 

Spawn Default Pawn For 를 오버로드하여 폰을 생성하는 예

Spawn Default Pawn For는 OnRestartPlayer 이후에 자동으로 호출되며 Possess 함수는 사용할 필요 없다

 

Posted by cwisky

Visual Studio Code를 실행하고 왼쪽 EXPLORER 에서 작업폴더를 선택하고 CTRL + SHIFT + P 키를 누른다

검색창에 Configure Task 입력

Create tasks.json file from template 항목 선택

MSBuild, maven, .NetCore, Others 등의 아이템 중 Others 선택 : 이 결과 tasks.json  파일이 작업폴더에 생성됨

 

생성된 tasks.json의 파일의 내용

{

   // See https://go.microsoft.com/fwlink/?LinkId=733558

  // for the documentation about the tasks.json format

  "version": "2.0.0",

  "tasks": [

        {

          "label": "echo",

          "type": "shell",

          "command": "echo Hello"

       }

  ]

}

 

 

tasks.json 파일의 내용을 아래처럼 변경하여 저장한다

{

   "version": "2.0.0",

   "tasks": [

      {

         "label": "Chrome",

         "type": "process",

         "command": "chrome.exe",

         "windows": {

            "command": "C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe"

         },

         "args": [

            "${file}"

         ],

         "problemMatcher": [],

         "group": {

            "kind": "build",

            "isDefault": true

         }       

       }

   ]

}

 

 

VS Code에서 프런트 엔드 코드(HTML, CSS, Javascript)를 작성하고 CTRL + SHIFT + B 키를 누르면 구글 Chrome이 실행되어 프런트엔드 코드가 크롬에서 실행되는 것을 확인할 수 있다

Posted by cwisky