Unity basic parts (5) – Uni-Run(2)

      Unity basic parts (5) – Uni-Run(2)에 댓글 없음

레이어의 순서는 Z 값에는 영향 받지 않는다.
정렬순서는 Sorting Layer를 변경한다.

카메라 – 백그라운드 => 스포이드 툴로 배경 이어줌

transform.Translate // 평행이동 메서드 : 오브젝트 좌표계(자기자신의)로 이동한다. 글로벌 아님
// 두번째 파라미터는 Space.Self 가 생략되어있다. 이동 방향

Ctrl+D : 오브젝트 복제

게임오브젝트의 크기를 찾는법 : Box Collider 2D 를 추가하여 Size를 찾는다.

Awake() : Start()와 비슷하지만 Start() 보다 한박자 빠르다.
OnEnable() : 컴포넌트가 활성화될때 마다 매번 실행되는 메서드
OnDisable() : 컴포넌트가 활성화될때 마다 매번 실행되는 메서드

OnCollisionEnter2D(Collision2D collision)
collision.collider : 충돌한 상대방 collider

Anchor : 배치의 기준점. (글로벌 좌표계). 프레임의 기준점, 민 맥스를 쪼개면(다르게 하면) 늘이는 영역을 나타낸다 (스트래치 모드)

Pivot : 스스로의 기준점.

Canvas Scaling
Canvas Scaler : UI Scale Mode – 고정픽셀모드/스케일 with 스크린 사이즈
Match : 화면 비가 다를때 사용 : Width, Height

Runner 게임 소스
https://github.com/reastykim/SVVR-Uni-Run

Unity basic parts (4) – Uni-Run(1)

      Unity basic parts (4) – Uni-Run(1)에 댓글 없음

이번엔 새로운 게임 Runner!

3D Project : Texture 라는 3D 용 Asset을 로딩한다.
2D Project : 처음 임포트 할때, Sprites 라는 2D 용 Asset을 로딩한다.

[Camera].Projection
– Perspective : ??
– Orthographic : 원근법이 없는 카메라 모드.

Sprite 시트 : 하나의 동작(애니메이션)을 하나의 파일로 저장한다. 이것을 잘라서 쓴다.
Assets-Sprites
Sprite Mode
    – Multiple 선택. [Apply]버튼 클릭 –> Sprite Editor가 열린다.

[Rigidbody 2D].Collision Detection
– Discrete : 충돌이 1초에 70번 정도 발생. 주기기반 이기 때문. 겹치기도 전에 통과해 버릴수도 있다.
– Continuous : 연속적으로 체크. 성능은 다소…

Circle Collider 2D 컴포넌트를 사용자 케릭터에 추가 : 모서리 충돌 체크가 잘되기위해..

Audio Source : 스피커
Play On Awake : Play시에 한번만 재생

[Main Camera].Audio Listener : 주변의 오디오 소스를 듣는다. 하나의 Scene에 하나만 있어야 한다.

[Window-Animation-Animation]
애니메이션을 만드는 방법 : Animator 선택후, 여러개의 이미지를 나열함. 드래그&드랍. Sample 수를 지정하면 애니메이션 재생속도를 조절할 수 있다.

애니메이터 컨트롤러 : Player ; 애니메이션의 스테이트먼트를 제어할 수있다. (유한상태머신 사용)
유한상태머신(FSM) : 가장 기초적인 오토마타(인공지능). 한번에 하나의 상태만 활성화 된다.
상태와 상태 사이를 변경할 수 있다. 각 상태는 조건을 이용하여 변경한다. Transition(화살표) Make

Any State : 포탈(?). 어떠한 현재 상태이던지, 조건만 맞으면 변경할 수있다.

[Animator].Parameters 에서 조건 설정.
– Float, Int, Bool : 값을 할당.
– Trigger : 값을 Set 함. 값을 할당하는 방식이 아니라, 방아쇠가 당겼다가 즉시 돌아온다. 잠깐 True 됐다가 받아들이고 나서 False가 된다.

Machene Statement를 여러개 만들 수도 있다. (평행하게)

트랜지션(정의)의 인스펙터의 컨디션즈를 조정.
다양한 파라미터가 있음.
Settings
Has Exit Time. 특정 종료 시점이 있음.

Ordered Interruption : 3D 에서만 동작. 이미지간의 전환시 관절을 부드럽게 해주는…

Sorting Layer : 가장 아래쪽에 있는 레이어가 우선순위가 높다.

Unity basic parts (3) – 3D 총알피하기 게임 만들기(2)

이제민 강사님이 강의내용 공유해 주시는 사이트.
boxcollider.io

Unity Project : 폴더기반으로 하나의 프로젝트가 관리되며, 관리되는 폴더는[Assets,Packages,ProjectSettings] 가 있다.

[Collider].Is Trigger : 충돌 감지여부
– Checked : 총알끼리는 부딪히지 않아야 한다. 기본적으로 뚫고 지나가야함.
충돌감지, 상대방을 밀어내지는 않지만 충돌감지는 한다.
물리적인 반발력은 필요하지 않을때 사용한다.

유니티의 메세지 기반 함수들. Start(), Update(), …

OnTriggerEnter(상대방 콜라이더) 둘 중 하나라도 Rigidbody를 가지고 있다면 메세지를 Broadcasting.

유니티 개발자는 충돌 그자체를 구현하기보다 출동을 감지했을때 무엇을 할까에 집중한다.

Rigidbody : 게임오브젝트에 물리영향을 받을 수 있게끔 한다.

FindObjectOfType() : 많이 쓰면 안됨. Scene 에 존재하는 모든 게임오브젝트를 검색하기 때문.

Time.deltaTime : 직전의 Update()가 호출된 시간으로부터의 흐른 시간. 시간간격

UI (2D)도 게임 오브젝트이다.
EventSystem : 사용자가 입력을 가했을때, 그 입력을 당했을때 그것을 알려주는 역할을 한다.
알아서 동작함. UI요소들에게 입력을 당했을때 알려준다.

Canvas: 모든 UI요소(2D)들의 부모이다.

Rect Transform, Anchor Presets 를 눌러 설정할때 Alt 를 눌러 기준점과 함께 위치를 변경한다.

글상자보다 글자가 커서 안보일때, Alignment : middle, center,
Horizontal Overflow : overflow, Vertical Overflow : overflow (/wrap:자르기)
잘안보이면, shadow 또는 outline component를 적용
Add Component, UI, effects

Prefab : Bullet를 Assets로 드래그&드랍하면 Prefab 형식으로되며, 재사용 가능하다.

[Canvas].Scaler
UI Scale Mode : 기준해상도를 설정. Scale With Screen Size, Constant Pixel Size, Constant Physical Size
Match : Width;가로는 짤릴수 있고 세로는 안짤린다.
PlayerPrefs : 사용자 설정을 K,V 형태로 로컬 파일에 저장된다. 키가 없으면 Type의 기본값을 반환한다. 보안은 약하다. 해킹에 위험이 있다.

Dodge 게임 소스
https://github.com/reastykim/SVVR-Dodge

 

 

Unity basic parts (2) – 3D 총알피하기 게임 만들기(1)

강의가 이론 위주로 진행되는게 아니라 실습위주로 진행되다보니, 내가 별도로 정리가 힘들다.
실습하면서 메모했던 내용을 기반으로 노트형태로 정리해야 겠다.

오늘은 2일째. 3D 총알피하기 게임 만들기 이다.

[Material].Albedo : 빛에 반사되는 색깔을 설정한다. 반사율-Albedo이라고도 하며, 자세한 설명은 위키참조.

[Camera].Clear Flags
Skybox : 가상의 하늘을 그린다.
Solid Color : 단색으로 채운다.
Depth Only : ??
Don’t Clear : ??

[Rigidbody] : 실제 물리적인 모든 기능을 담당하는 컴포넌트. 2D에 대해서는 Rigidbody 2D 컴포넌트를 사용한다.

[Input] 수평축과 수직축의 입력값을 감지하여 저장
GetAxis는 입력축의 음의 방향의 키 : -1.0
아무것도 누르지 않으면 : 0.0
양의 방향의 키 : +1.0

이러한 방식을 쓰는 이유
– 사용자가 키 변경을 할수 있게 하기 위해.
– 코드가 하드웨어에 대한 종속성을 가지지 않기 위해.
– 키보드 커스터마이징을 편하게 할 수 있다.
– 코드랑 입력의 이름이 연결되어있고, 입력이 하드웨어로 연결되어 있다.
– 조이스틱에 대응 : Axis, 입력을 숫자로 받는 이유는 조이스틱은 약간만 누른다던지, 그러한 컨트롤이 가능하기 때문

프로젝트 세팅 메뉴에서 Input에 관한 설정이 가능
[Menu] – [Edit] – [Project Settings] – [Input] InputManager : Axes,Horizontal,Vertical

가속도 : 힘을 질량으로 나눈값. 역시나 자세한 설명은 위키참조.
F = ma

 

 

Unity Overview – Unity basic parts (1)

      Unity Overview – Unity basic parts (1)에 댓글 없음

간만에 포스팅. 간만에 새로운 무언가를 할 기회가 있기 때문이다.
바로 Unity 가 그것! 회사에서 내년에 Unity로 무언가 프로젝트를 할 거란다. 평소 관심있던거라 잽싸게 교육신청했다.

유니티 러닝 센터(SVVR)에서 진행하는 ‘Unity2017을 활용한 2D/3D 게임 개발(초급)’ 강의를 들으며 공부한 내용을 정리하고자 한다.

교육 첫째날, 강사 본인의 짧은 소개와 함께 강의가 시작되었다. 재민 강사님 이었던가..기억이…(죄송;;)

툴의 기본적인 사용법 익힘을 위하여 바로 실습이 진행되었다.

낙하하는 Cube를 구현해보았다.
‘Hierarchy’ 메뉴에서 ‘Create’ – ‘3D Object’ – ‘Cube’를 선택하여 Scene에 ‘3D Cube’를 추가하였다.
(헐, 이게 다야? C# WPF로 구현하려면…..ㅎㄷㄷ) 4번의 클릭으로 3D Cube를 생성하다니! Awesome!
(여담이지만 Unity에서 unit 이란 단위가 앞에서 생성한 3D Cube의 한변의 길이라고 한다.)

3D Cube가 땅에 떨어지려면? 3D Cube가 있으니, 이제 땅을 만들자!
‘Hierarchy’ 메뉴에서 ‘Create’ – ‘3D Object’ – ‘Plane’를 선택하여 Scene에 ‘Plane’를 추가한다.
3D Cube가 반쯤 바닥에 파묻힌 상태가 될것이다.
(Object를 추가했을때 항상 ‘Inspector’메뉴에서 Transform이 초기값인지 확인하자.)

이제 3D Cube의 Y 값을 조절하여 바닥에서 떨어트리자. ‘Scene’화면에서 Cube를 선택하면 연두색(Y), 빨간색(X), 파란색(Z) 축의 값을 설정할 수있는 화살표가 생긴다. 연두색(Y)화살표를 클릭하고 위로 쭉~땡기면 바닥에서 점점 멀어진다. 당연히 아래로 쭉~땡기면 점점 가라 앉는다. ‘Inspector’ – ‘Transform’메뉴에서 Position Y 값이 변경되는것을 확인할 수 있다. Y 값을 5정도로 설정하자.

3D Cube

3D Cube

이제 화면 중앙에 있는 Play 버튼 (▶)을 클릭하면… 아무 변화가 없을것이다. (ㅋㅋㅋ왜했니)
이 Cube에 생명력(?)을 주려면 Rigidbody 컴포넌트를 추가한다.
‘Inspector’ 메뉴 맨 밑에 있는 Add Component 버튼을 클릭하고 ‘Physics’ – ‘Rigidbody’ 를 클릭한다.

이제 다시 화면 중앙에 있는 Play 버튼 (▶)을 클릭하면… 짜잔!
Cube가 중력가속도를 받으며 떨어지다가 바닥에 정지하게 된다. 클릭 몇번으로 구현한 것이다. 정말 놀랍다…

간단한 실습은 여기까지…
하지만 이 실습으로 Unity 툴의 기본적인 사용법인 Scene에 오브젝트를 추가하는 법, 축에 대한 이해 및 조작법, 오브젝트에 컴포넌트를 추가하는 방법을 익힐 수 있었다.

그뒤로 지루한 C# 기초문법 강의가 계속되었다.(강사님 저는 C#만 10년 했습니다..)

그리고 가장 흥미로웠던 내용하나.
Unity는 잘 만들어진 Component의 조합으로 원하는 기능을 만들어 내는

Composite Pattern

으로 개발한다는 것. Unity의 핵심 패턴이라고 한다.

위에서 추가하였던 3D Cube 오브젝트에는 Transform, Mesh Filter, Box Collier, Rigidbody 컴포넌트가 각각 서로의 영향을 받지않고 동작한다.

추가로 C# 스크립트를 활용하여 위로 살짝 점프했다가 떨어지는 기능도 구현하였다.
‘Project’ 메뉴에서 Assets 화면에서 마우스 오른쪽 클릭하여 Context 메뉴에서 ‘Create’ – ‘C# Script’를 선택하여 C# 스크립트를 추가한다. 이름은 간단하게 ‘Jump’로 한다. 생성된 Jump 아이콘을 더블클릭하면 이제 친숙한 Visual Studio가 실행되면서 C# 파일을 편집할 수 있다.

Jump 클래스에서 Rigidbody type의 public filed를 하나 만들고, Start에서 rigidbody의 AddForce() 메서드를 호출하여 y값을 300 으로 설정하였다. 컴파일할 필요도 없이  Ctrl + S 키를 눌러 저장하고 다시 Unity로 돌아온다.

 

‘Project’ 메뉴에서 Jump를 선택하고, ‘Hierarchy’의 Cube에  Drag&Drop하면 작성하였던 스크립트가 해당 오브젝트에 적용이 된다. ‘Inspector’에 Jump script가 추가된 걸 확인할 수있다.
아직 한가지 작업이 더 남았다. 아까 public Rigidbody rigidbody 필드를 생성했는데, 이것을 3D Cube가 이미 가지고 있는 Rigidbody와 연결시켜주어야 한다. 어떻게 하냐구?
‘Inspector’ 화면에서 Righdbody 글자를 Drag하여 Jump (Script)의 None (Rigidbody) 박스에 Drop!

link component to script

link component to script

작업 끝! 다시 화면 중앙에 있는 Play 버튼 (▶)을 클릭하면 3D Cube가 위로 살짝 떠올랐다가 떨어지는 화면을 볼 수 있다.

이것으로 C# 스크립트를 어떻게 사용하는지도 배우게 되었다.

잼있다. 진짜 잼있다! 피곤한 교육 일정이지만 재미있게 배울수 있을 것 같다.

UWP Remote Debugging

      UWP Remote Debugging에 댓글 없음
  1. Install the ‘Remote Tools’ on Target device
  2. Run the ‘Remote Tools’
  3. ‘Configure remote debugging’
  4. Set debug options for Target Project properties
    1. ‘Start options’ – ‘Target device’ : Remote Machine
    2. ‘Find’‘Auto Detected’ Tab : ‘Select’ Target device
  5. ‘Start Debugging’

 

Refer link : https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging

UWP App Name Localization

      UWP App Name Localization에 댓글 없음

1. 개요

오랜만에 시간이 생겨 Windows Template Studio1로 프로젝트를 하나 생성하여 가지고 놀았다.

App을 생성하면  지역화 기능도 포함되어, ‘Strings/en-us/Resources.resw’ 파일이 추가되어 있다. App을 실행하면, App의 Project 명으로 App의 이름이 설정된다. 이 App의 이름이 각 나라별로 변경되도록 설정하고 싶었다. 예를 들면, 한국에서는 App 이름이 ‘한글’로, 미국에서는 ‘English’로 표시되게 말이다.

2. 방법

2.1. 준비

일단 한국어 변경을 위해서 ‘Strings’ 폴더 하위에 ‘ko-kr’ 폴더를 생성하고, ‘Resources.resw’ 리소스 파일을 추가한다.

그 다음, 각 리소스에 ‘AppName’ 이라는 키를 추가하고 원하는 이름을 설정한다. 위의 예처럼 변경하기 위해,
‘Strings/en-us/Resources.resw’ 파일에는 ‘English’,
‘Strings/en-us/Resources.resw’ 파일에는 ‘한글’이라고 추가한다.
키는 ‘AppName’ 대신에 각자가 원하는 것으로 변경가능 하다.

2.2. 설정

프로젝트의 설정을 열어 ‘Package Manifest..’버튼을 눌러 패키지 매니페스트 편집화면을 연다.
‘Application’ 탭의 ‘Display name’값을 변경하면 원하는 이름으로 App의 이름을 변경할 수 있다. 기본적으로 프로젝트명으로 설정되어 있다.

이 값을 ‘ms-resource:AppName’으로 변경한다. 리소스파일에서 ‘AppName’키를 참조한다는 설정이다.

3. 확인

App을 실행시켜보면 운영체제에 설정된 언어에 따라 App의 이름이 변경되어 있음을 확인할 수 있다.
또한 Windows 설정의 ‘앱 및 기능’에 보면 변경된 App이름으로  설치되어 있음을 확인할 수 있다.

4. 추가내용

App의 권한 팝업 같이 Package display name을 변경하여야 할 때도, 같은 방법으로 패키지 매니페스트 편집화면에서 ‘Packaging’탭의 ‘Package display name’값을 ‘ms-resource:AppName’로 설정하면 적용가능하다.

5. 참고

  1. Windows Dev Center – Localize strings in your UI and app package manifest

 

Visual Studio XAML Designer bug : ‘The type ” from assembly ” is built with an older version of the Blend SDK, and is not supported in a Windows Presentation Framework 4 project.’

WPF 를 사용하다보면 아래와 같은 에러를 내뿜으며 XAML Designer가 뻗는 경우가 있다.

The type '[]' from assembly '[]' is built with an older version of the Blend SDK, and is not supported in a Windows Presentation Framework 4 project.

원인은 System.Windows.Interactivity.dll 파일과 Microsoft.Expression.Interactions.dll 파일 때문!

해결책 :

Developer Command Prompt for VS 201x관리자 권한으로 실행

gacutil -i "C:\Program Files (x86)\Microsoft SDKs\Expression\Blend\.NETFramework\v4.5\Libraries\System.Windows.Interactivity.dll"

“Assembly successfully added to the cache” 메세지가 출력되면 성공

Visual Studio 재시작하면 정상적으로 XAML Designer가 동작함을 확인할 수 있다.

30장 ASP.NET Core 1.0에서 의존성 주입 사용하기

30. ASP.NET core 1.0에서 의존성 주입 사용하기

ASP.NET Core 1.0에서는 자체 내장된 새로운 형태의 의존성 주입 시스템이 기본적으로 내장되어 있다.
Startup.cs 파일에서 설정한다.

30.1. DI컨테이너의 세 가지 모드

  • Transient : 새로운 인스턴스가 매번 생성된다.
  • Singleton : 단일 인스턴스가 생성되고 싱글톤으로 처리된다.
  • Scoped : 현재 스코프 내에 단일 인스턴스가 생성된다. 스코프란 웹으로 요청된 동일 요청을 말한다.

컨트롤러에서는 생성자 주입을 통해서, 뷰에서는 @inject 키워드로 사용한다.