2019년 10월 26일 토요일

Visual Studio Code(이하 VSCode)를 유니티 에디터 - Mac

Visual Studio Code(이하 VSCode)를 유니티 에디터로 디버깅
준비 :Mac에 Unity, VSCode, Homebrew

버전

  • MacOSX (10.13 High Sierra)
  • Unity (2017.1.2f1 Personal)
  • VSCode (1.16.0)
  • Homebrew (1.3.1)

1. 각 도구의 다운로드 및 설치

  • .NET Core
    • .Net Framework의 일부 (부분)에서 크로스 플랫폼에 대응하고있다
    • 요점 .NF 기능의 일부를 Linux와 Mac에서도 사용할 수 있도록 한 것 (같은 인식에있어있어?)
    • 링크에 설치 방법이 써 있으므로 참조
  • VSCode.cs
    • VSCode을 Unity 편집기로 사용하기위한 설정 파일
    • GitHub의 DownloadZip에서 떨어 뜨려 압축
    • Unity 프로젝트 /Assets/Plugins/Editor/VSCode.cs로 배치

2. Homebrew에서 필요한 도구를 설치

mono

$ brew install mono

openssl

$ brew install openssl
위 명령 /usr/local/opt/openssl에 설치된다. 
그러나 이대로라면 기본에 /usr/bin/openssl이용되어 버리기 때문에 
.bash_profile새로운 사람의 설치 경로를 추기한다.
$ vim ~ / .bash_profile
.bash_profile
export PATH = / usr / local / opt / openssl / bin : $ PATH

3. VSCode에 필요한 플러그인을 설치

Command + p 명령 팔레트를 표시
스크린 샷 2017-08-28 13.00.33.png
입력 폼에 ext install계속 설치하려는 플러그인 이름을 입력하고 Return한다.

C # for Visual Studio Code

ext install C #

Debugger for Unity

ext install Debugger for Unity

Mono Debug

ext install Mono Debug
이스토루이 완료 Extensions 설치 된 항목에 표시된다.
스크린 샷 2017-08-28 13.png

4. Unity를 시작 연계 설정

1. Unity> Preferences> External Tools를 열 
2. External Script Editor 항목 풀다운 메뉴에서 Other를 선택 
3. Visual Studio Code.app을 선택 (풀다운이 code로 바뀐다)
스크린 샷 2017-06-02 11.56.26.png
4. Unity> Preferences> VSCode 열기 (기본 기본으로 OK)
스크린 샷 2017-06-02 11.56.43.png

5. VSCode을 시작 IntelliSense를 사용하려면

인텔리 센스 (IntelliSense)는 Microsoft Visual Studio 통합 개발 환경에서 사용되는 Microsoft에서 자동 완성 시스템.
1. Unity 측의 Assets> Open C # Project In Code에서 VSCode을 시작
스크린 샷 2017-08-28 13.21.12.png
2. 프로젝트 아래에 .sln 파일이 있는지 확인
스크린 샷 2017-08-28 13_2.png
3. 적당히 .cs 파일을 열 
4. VSCode의 상태 표시 줄 (화면 하단의 녀석)의 오른쪽이 뿌제쿠토 이름 .sln되어 있는지 확인 
(되어 있지 않다면 클릭하여 변경)
스크린 샷 2017-08-28 13_4.png
IntelliSense가 활성화 될 때 보완과 함수 점프 등의 기능 외에 
n references같은 느낌으로 그 메소드와 변수가 다른 사람에서 얼마나 참조되고 있는지를 알 수있게된다.

6. 단계 실행

  1. 브레이크 포인트를 적당하게 붙여 VSCode 측을 디버그 모드로 전환한다. Shift + Command + d)
  2. 화면 상단의 Start Debugging 버튼 (디버그 창 녹색 삼각형)을 클릭하면 DEBUG CONSOLE에 부착 정보가 출력되고 대기 상태가된다.
  3. Unity 측에서 재생하면 브레이크 포인트에서 처리가 중지됩니다.
스크린 샷 2017-08-28 13.35.33.png

.gitignore_global

#################################################################################

*~
.DS_Store

#################################################################################
###### android studio ###########################################################
# Built application files
*.apk
*.ap_

# Files for the ART/Dalvik VM
*.dex

# Java class files
*.class

# Generated files
**/build/
**/release/
**/.idea/

**/bin/
**/gen/
**/out/

# Gradle files
**/.gradle/

# Local configuration file (sdk path, etc)
local.properties

# Proguard folder generated by Eclipse
**/proguard/

# Log Files
*.log

# Android Studio Navigation editor temp files
**/.navigation/

# Android Studio captures folder
captures/

# IntelliJ
*.iml
.idea/workspace.xml
.idea/tasks.xml
.idea/gradle.xml
.idea/dictionaries
.idea/libraries

# Keystore files
# Uncomment the following line if you do not want to check your keystore files in.
#*.jks

# External native build folder generated in Android Studio 2.2 and later
.externalNativeBuild

# Google Services (e.g. APIs or Firebase)
google-services.json

# Freeline
freeline.py
freeline/
freeline_project_description.json

# fastlane
fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output
fastlane/readme.md



#################################################################################
###### Xcode ####################################################################
# Xcode
#
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore

## Build generated
**/build/
**/DerivedData/

## Various settings
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
**/xcuserdata/

## Other
*.moved-aside
*.xccheckout
*.xcscmblueprint

## Obj-C/Swift specific
*.hmap
*.ipa
*.dSYM.zip
*.dSYM

# CocoaPods
#
# We recommend against adding the Pods directory to your .gitignore. However
# you should judge for yourself, the pros and cons are mentioned at:
# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
#
# Pods/

# Carthage
#
# Add this line if you want to avoid checking in source code from Carthage dependencies.
# Carthage/Checkouts

Carthage/Build

# fastlane
#
# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
# screenshots whenever they are needed.
# For more information about the recommended setup visit:
# https://docs.fastlane.tools/best-practices/source-control/#source-control

fastlane/report.xml
fastlane/Preview.html
fastlane/screenshots
fastlane/test_output

# Code Injection
#
# After new code Injection tools there's a generated folder /iOSInjectionProject
# https://github.com/johnno1962/injectionforxcode

iOSInjectionProject/



#################################################################################
###### Unity3d ##################################################################
#
**/[Ll]ibrary/
**/[Tt]emp/
**/[Oo]bj/
**/[Bb]uild/
**/[Bb]uilds/
**/Assets/AssetStoreTools*

# Visual Studio 2015 cache directory
**/.vs/

# Autogenerated VS/MD/Consulo solution and project files
ExportedObj/
.consulo/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd
*.pdb

# Unity3D generated meta files
*.pidb.meta
*.pdb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage


#################################################################################

자바,자바스크립트, C#, 파이썬 정규표현식

자바 정규표현식
import java.io.Console;
import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class MyRegex{
    public static void main(String[] args){
        String searchTarget = "Luke Skywarker 02-123-4567 luke@daum.net";

        Pattern pattern = Pattern.compile("\\d+");
        Matcher matcher = pattern.matcher(searchTarget);
        while(matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}

자바스크립트 정규표현식
var searchTarget = "Luke Skywarker 02-123-4567 luke@daum.net";
var regex = /\d+/g;
console.log(searchTarget.match(regex));

C# 정규표현식
using System;
using System.Text.RegularExpressions;

public class RegexTest {
public static void Main() {
string regex = "\\d+";
string searchTarget = "Luke Skywarker 02-123-4567 luke@daum.net";
foreach (Match m in Regex.Matches(searchTarget, regex)){
Console.WriteLine(m.Value);
}
}
}

파이썬 정규표현식
regex = r'\d+'
search_target = '''Luke Skywarker 02-123-4567 luke@daum.net
princess leia 010 2454 3457 leia@gmail.com'''

import re
result = re.findall(regex, search_target)
print("\n".join(result))

AB(Apache HTTP server benchmarking tool)를 활용해 벤치마킹 테스트

AB(Apache HTTP server benchmarking tool)를 활용해 벤치마킹 테스트

옵션 설명
-n 성능을 검사하기위해 보내는 요청수. 기본값으로 요청을 한번만 보내기때문에 일반적인 성능검사 결과를 얻을 수 없다.
-c 동시에 요청하는 요청수. 기본적으로 한번에 한 요청만을 보낸다.
-g 측정한 모든 값을 'gnuplot' 혹은 TSV (Tab separate values, 탭으로 구분한 값) 파일에 기록한다. 라벨은 output 파일의 첫번째 라인을 참고한다.
-t 성능을 검사하는 최대 초단위 시간. 내부적으로 -n 50000을 가정한다. 정해진 시간동안 서버 성능을 검사할때 사용한다. 기본적으로 시간제한 없이 검사한다.
-v 출력 수준을 지정한다.
    4 이상이면 헤더에 대한 정보를,
    3 이상이면 (404, 202, 등) 응답코드를,
    2 이상이면 경고(warning)와 정보(info)를 출력한다.
-A 프록시를 통해 BASIC Authentication 정보를 제공한다.
    :로 구분한 사용자명과 암호를 base64 인코딩하여 전송한다.
-X proxy[:port] 프록시 서버를 사용하여 요청한다.

$ ab -n 10 -c 3 http://www.google.com
3개의 프로세스(쓰레드)가 10개씩 쏴주는게 아니라 3개의 풀을 가지고 10번 요청을 진행한다.

디자인 패턴 다시보기(정리중)

------------------------------------------------------
------------------------------------------------------
Command Pattern(명령 패턴)

가능한 모든 요청명령을 캡슐화화여 스트림으로 처리되도록 구현
스퀀셜한 명령 처리가 가능하고 취소(undo) 및 재실행(redo)이 가능함

- 플레이어를 포함한 NPC, Monster들의 동작 지시에 활용
- UI에 적용할 경우 튜토리얼 동작에도 활용가능


------------------------------------------------------
------------------------------------------------------
flyweight Pattern(경량/플라이급 패턴)

공통된 자원을 메모리상 공유하게금 처리하여 메모리 손실을 줄이고
- 유사한 모양의 다수의 오브젝트들을 구성할때...
  > 수많은 나무들, 지형 타일들
- 메쉬, 텍스쳐, 메터리얼 등 공통된 자원은 서로 공유하여 사용되게금 처리
- 객체 풀 패턴과 함께 사용해야 유용함

* 드로잉 콜을 줄여주는 인스턴스 렌더링 기술과 접목하면 효과적!


------------------------------------------------------
------------------------------------------------------
observer Pattern(관찰자 패턴)

특정 변화를 감시하고 변화(이벤트)가 생길경우(통지가 날라오면) 값의 변화에 따라 정해진 처리 흐름을 수행하도록 구현
- 보유 자원량의 변화
- 업적 성취 여부 판단
- 패시브 아이템의 사용 여부
- 기본 설정값의 변화

* ReactiveX를 활용!


------------------------------------------------------
------------------------------------------------------
prototype Pattern(프로토타입 패턴)

원형의 인스턴스로 부터 동일한(혹은 성질만 일부 다른) 인스턴스를 복사 생성하는 패턴
원형이 되는 프로토타입 히든 인스턴스를 만들어 놓고 특정 오브젝트를 일정 주기별로 스폰!
구현레벨에서는 clone 가상함수를 통해 인스턴스를 복사생성 한다는 개념으로 이해
- 몬스터나 총알등의 스포너 spawner

데이터 모델링을 위한 프로토 타임
- json형태의 대상 객체를 생성
- 상속개념이 없는 json의 구조를 위임이라는 의미로 객체간 연결

{
"이름":"고블린보병",
"체력":20,
"내성":["추위, "독"],
"약점":["불", "빛"]
}

{
"이름":"고블린마법사"
"프로토타입":"고블린보병",
"마법":["화염구"]
"보너스 대미지":20,
}


------------------------------------------------------
------------------------------------------------------
singleton Pattern(싱글톤 패턴)

각종 메니져,메니져,메니져에 사용하고 있음..
코드들간의 커플링 문제를 야기함, 멀티쓰레드에 취약, 전역변수나 다름없음.
- 가능하면 메니져는 최소화
- 함수 인자로 넘길수 있다면 싱글톤으로 만들지 말자. 가능하다면 말이지...
- 필요하다면 최소한으로 묶어라..
  Game::Instance()->getFile()->save(...);
  Game::Instance()->getAudio()->play(...);

메니저들에 활용할 용도라면 서비스 중개자 패턴을 참고해보자


------------------------------------------------------
------------------------------------------------------
state Pattern(상태 패턴)

오브젝트 상태에 대한 인터페이스를 정의하고, 각 상태 동작을 처리하는 독립된 클래스 생성
상태가 변경됨에 떄라 상태 동작을 수행하는 인스턴스로 핸들 변경 처리..
(같은 상태에 대한 모든 동작과 데이터를 클래스 하나에 캡슐화!)
- 플레이어나 NPC, 몬스터등 FSM상태의 특성을 가지는 오브젝트들에 활용

class HeroState
{
   virtual ~HeroState();
   virtual void handleInput(Hero &hero, Input input) {}
   virtual void update(Hero &hero) {}
}

class StandingState : HeroState
{
   virtual void handleInput(Hero &hero, Input input)
   {
      if(input == RELEASE_DOWN)
         return new StrandingState();
   }
   ...
}


class Hero
{
public:
   enum class State { Standing, Ducking, Jumping, Siving };

   void handleInput(Input input)
   {
      HeroState *newState = state_->handleInput(*this, input);
      if(null != newState)
      {
         delete state_;
         state_ = newState
         state_->enter(*this);
      }
   }

   void update(Hero &hero)
   {
      state_->update(*this);
   }

private:
   HeroState *state_;
   //HeroState *state2_; ///< 상태를 여러개 두면 이 자체가 parallel state machine(병행 상태 기계)인것임.
}

** FSM(finite state machine) 유한 상태 기계
- 가질 수 있는 상태가 한정되어 있다.
- 한번에 한가지 상태만 유지할 수 있다.
- 입력이나 이벤트가 기계에 전달된다.
- 각 상태에는 입력에 따라 다음상태로 변경되는 전이가 있다.

** 푸쉬다운 오토마타
위 클래스에서 state_ 변수를 스택으로 관리하고 한 상태가 끝나면 스택의 이전 상태로 자동 회귀하는 방식



------------------------------------------------------
------------------------------------------------------
Service Mediator Pattern(서비스 중개자 패턴)
객체나 시스템 거의 모든 코드에서 사용되는 기능을..
로그나 오디오, 광고, IAP등 여기저기 고정 위치를 종잡기 어려운 기능들을 위한 패턴이랄까
싱글톤 형식만으로 구현하지 말고 각 기능별 인터페이스를 만들어 null인스턴스(널 서비스)를 만들어 초기화해두고 사용하는게 기본 개념


AudioService *pAudioService = ServiceProvider::Instance()->GetAudioService();
pAudioService->PlaySound("Lobby_BGM");


class ServiceProvider
{
public:
    static void initialize()
    {
        service_ = &nullService_;
    }

    static Audio& GetAudioService() { return *pAudioService_; }

    static void SetAudioService(AudioService *pAudioService)
    {
        if(service == NULL) // 널 서비스로 돌려 놓는다.
            pAudioService_ = &nullAudioService_;
        else
            pAudioService_ = pAudioService;
    }
private:
    static AudioService* pAudioService_;
    static NullAudioService nullAudioService_;
};


class AudioService
{
public:
    virtual ~Audio() {}
    virtual void playSound(int soundID) = 0;
    virtual void stopSound(int soundID) = 0;
    virtual void stopAllSounds() = 0;
};

class NullAudioService : public AudioService
{
public:
    virtual void playSound(int soundID) { /* 아무것도 하지 않는다. */ }
    virtual void stopSound(int soundID) { /* 아무것도 하지 않는다. */ }
    virtual void stopAllSounds(int soundID) { /* 아무것도 하지 않는다. */ }
};


class PlatformAudioService : public AudioService
{
public:
    virtual void playSound(int soundID) {
        // 콘솔의 오디오 API를 이용해 사운드를 출력한다...
    }
    virtual void stopSound(int soundID) {
        // 콘솔의 오디오 API를 이용해 사운드를 wndwl한다...
    }
    virtual void stopAllSounds(int soundID) {
        // 콘솔의 오디오 API를 이용해 모든 사운드를 중지한다...
    }
};


------------------------------------------------------
------------------------------------------------------
캐쉬 미쓰

데이터 메모리를 어떻게 배치하느냐에 따라 CPU의 캐쉬활용 성능이 크게 바뀐다.
(크게 50배까지 성능 향상을 볼 수 있단다.)

반복문에서 호출되는 포인터들을 가능한 한 배열안에 떄려 넣어 그 배열이 캐싱되어 고속처리 되게금 유도하는 구현 기법이랄까..