제어구조


if

String.valid? string인지 체크

 


unless

is_intege 숫자인지 체크

 


case

여러 패턴에 대해 매치해야 한다면 case를 이용

일치하는 패턴이 없는 경우 에러발생

'_'는 "그 외의 모든 것"에 매치되는 else처럼 생각하면 된다. (case구문에서 '_'이 없다면 일치하는 패턴이 없을 때 오류 발생)

 

'_'사용

 

case는 패턴 매칭에 의존하기 때문에 같은 규칙과 제약이 모두 적용된다. 기존의 변수에 매치하고자 한다면 핀연산자를 사용해야한다.

 

when으로 점검기능이있다. x > 0 크면 "Will match"

 


Cond

값이 아닌 조건식에 매치해야 할 때 사용 (else if 기능)

Cond문 마찬가지로 예외처리가 없으면 에러를 발생하는데, true조건식으로 처리해준다.

 


with

중첩된 case구문이 쓰일만한 곳이나 깔끔하게 파이프 연산을 할 수 없는 상황에서 유용하다.

'<-'은 오른쪽을 왼쪽과 비교하기 위해 패턴매칭을 사용

매치 실패한 경우

 

반응형

'프로그래밍언어 > Elixir' 카테고리의 다른 글

Elixir) 예제 연습_패턴 매칭  (0) 2019.08.22
(Elixir)로 JSON API 서버 만들기  (0) 2019.08.21
Elixir) 예제 연습 Enum  (0) 2019.08.21

파란색 : 풀면서 어려웠던 부분 or 고려해야 될 부분

빨간색 : 해결방법

초록색 : 느낀점

문제


우선 문제를 봤을 때 고려할 부분으로는 1,2,3학생 답 배열의 담겨있는 수들의 규칙이다.   

 

 

내 풀이


학생 답 각각 배열을 생성하고 문제에서 보여주는 값들 중 다시 반복이 되는 수 전까지 담아준다.  

int[] st1 = new int[5] { 1, 2, 3, 4, 5 }

int[] st2 = new int[8] { 2, 1, 2, 3, 2, 4, 2, 5 }

int[] st3 = new int[10] { 3, 3, 1, 1, 2, 2, 4, 4, 5, 5 }

그리고 정답배열을 순회하면서 학생 배열과 비교하고 학생배열의 값과 같다면 정답카운트인 score 배열의 값을 변경 시켜주도록 한다.  (코드는 5,8,10으로 나누었지만 확장성으로 st1.Length으로 나누어도 된다)

제한조건으로 최고점자가 동률이 나오면 오름차순으로 모두 출력해주어야 하기 때문에 for문을 통해 최대값을 구하고 그 값과 같은 배열만 list에 담도록 했다. 

 

다른 사람의 풀이


우선 차이점으로 학생배열을 2차원 배열로 만들고, 이중for문을 통해 if문 한개로 모든 학생배열을 순회하는 방식으로 정답카운트를 체크하고 있다. 그리고 배열.Max()함수를 통해 최대값을 찾고 그 리스트를 리턴하는 방식이다

내 코드처럼 각각 배열을 3개 생성하지 않고, 이차원배열로 생성했으며, if문으로 각자 배열을 매직넘버인 1,2,3를 넣어서 순회하는 것이 아닌 이중포문으로 한번에 비교를 한다는점에서 더 효율적인 풀이법인 것같다.


 

 

반응형

패턴 매칭은 Elixir의 강력한 기능. 간단한 값, 자료 구조, 심지어는 함수까지도 매치시킬 수 있음

 

 

상수 매칭

 

컬렉션 매칭

1. 리스트

2. 튜플

 

핀 연산자

매치 연산자의 좌변에 변수가 포함되어 있을 때에는 값의 대입이 일어납니다. 하지만 경우에 따라서는, 뱐수에 새로운값이 대입되는 것을 원치 않을 수 있다. 이러한 상황에서는 핀 연산자^를 사용해야한다.

함수의 절에 핀연산 적용

 

반응형

Game logic


Update

호출되는 시점 :  스크립트가 활성화 된 경우 매프레임마다 호출

 

Fire Animation Eevents

호출되는 시점 :  마지막 Update시간과 최신 Update업데이트 시간사이에 모든 클립에서 애니메이션이벤트를 호출

 

OnAnimatorMove 

호출되는 시점 :  Update 프레임마다 Animator컴포넌트에 대해 한 번 호출

 

OnAnimatorIK

호출되는 시점 :  Update 프레임마다 Animator컴포넌트에 대해 한 번 호출

 

LateUpdate

호출되는 시점 : Update가 끝난 후 프레임당 한 번 호출

특징

1. Update에서 수행된 모든 계산은 LateUpdate가 시작 할 때 완료 됨

2. 일반적으로 3인칭 카메라에 사용된다.

(캐릭터를 움직이고 Update방향을 카메라 움직임과 로테이션 계산을 수행하는 경우 LateUpdate에서 카메라로 그 위치와 방향에 맞게 움직이도록)

 


 

Scene rendering


OnWillRenderObject

호출되는 시점 : 카메라에 오브젝트가 표시되면 각 카메라에 한 번 호출

특징

1. 스크립트가 활성화 되어있어야 호출됨

2. 모든 컬링된 객체들을 렌더링하기 바로 직전의 과정인 컬링 처리중에 호출

 

OnPreCull

호출되는 시점 : 카메라에서 장면을 컬링하기 전에 호출(프로스터 컬링)

특징

1. 카메라에 붙어있는 스크립트에만 호출

2. 카메라의 속성을 바꾸고싶을때 사용하면 좋음

 

OnBecameVisible / OnBecameInvisible

호출되는 시점 : 카메라에 표시되거나/표시되지 않을 때 호출

 

OnPreRender

호출되는 시점 : 카메라가 씬 렌더링을 렌딩하기 전에 호출

특징

1. yield 사용 가능

2. 스크립트는 카메라에 붙어있어야함 

 

OnRenderObject(queueIndex:int)

호출되는 시점 : 오브젝트가 렌더링처리 된 후 호출

특징

1. queueIndex은 해당 오브젝트를 렌더링할 때 사용하는 렌더 큐의 값

 

OnPostRender

호출되는 시점 : 카메라가 씬 렌더링을 마친 후 호출

특징

1. 카메라에 붙어있는 스크립트에만 호출

2. 해당 카메라가 모든 오브젝트를 렌더링한 후 호출

 

OnRenderImage

호출되는 시점 : 씬 렌더링이 완료된 후 호출

 


 

Gizmo rendering


OnDrawGizmos

특징

1. 시각화 목적으로 씬 뷰에 기즈모를 그릴 때 사용


 

End of frame


yield WaitForEndOfFrame

호출되는 시점 : 하나의 프레임이 완전히 종료될 때 호출 

특징

1.  Update,LateUpdate이벤트가 모두 실행되고 화면에 렌더링이 끝난 이후 호출


 

Decommissioning


OnDisable

호출되는 시점 : 스크립트가 비 활성화 되거나 오브젝트가 비 활성 상태가 될 때 호출

특징

1. 오브젝트가 제거되는 경우에도 호출

2. 삭제를 위한 작업에 사용

3. 에디터모드일때 스크립트가 다시 로드되는 경우에도 호출

4. Start와 달리 코루틴 사용할 수 없음

OnDestroy

호출되는 시점 : 오브젝트 존재의 마지막 프레임 업데이트를 마친 후 에 호출

특징

1. 씬 게임이 종료될 때 도 발생

2. 오브젝트가 상태가 활성화 상태였던 경우에만 호출

 

반응형

프로젝트를 하면서  유니티 어떤 함수가 먼저 호출 될까? 라는 생각을 했지만  순서의 영향이 주는 프로젝트가 아니어서 넘어갔었는데 이참에 정리해보았다.

 

함수호출 순서로(위에서 부터 먼저 호출)

 

Initializion (초기화부분)

 


Awake

호출되는 시점 :  스크립트 객체가 로딩될 때, 단 한번 호출됨

특징

1.  모든 오브젝트가 초기화 된 후 호출된다.

2. Start함수 전에 호출된다.

3. coroutine동작 불가능

 

OnEnable

호출되는 시점 :  스크립트가 켜질 때

특징

1.  플레이모드 중에 스크립트를 편집할 경우, 편집이 끝난 후 스크립트가 다시 로딩되면 호출됨(Awake와 Start는 호출되지 않음)

2.   Awake함수 호출 후  호출됨 

 

Start

호출되는 시점 :  Update함수가 처음 호출 될 때 Update함수 직전에, 단 한번 호출됨

특징

1.  Awake와 다르게  start함수는 스크립트가 켜져있을 때 호출된다. (Awake는 스크립트가 꺼진 상태에도 호출됨)

2. Awake함수는 항상 Start함수 호출되기 전에 호출 된다.


 

 

Physics (물리)


FixedUpdate

호출되는 시점 :  스크립트가 켜져 있을 때 매프레임마다 호출

특징

1.  설정한 값에  따라 일정한 간격으로 호출된다.

2. 모든 물리계산 업데이트는 FixedUpdate후 즉시 발생된다.

3. 일정한 시간으로 호출되기에 Time.deltaTime을 곱할 필요 없다.

4.  Rigidbdoy를 다룰 때  일정한 힘을 가할 때, Update함수 대신에 사용 

(불규칙적인 Update에서는 물리엔진충돌 검사 등이 잘 안될 수 있다.)  

 

yield WaitForFixedUpdate (코루틴)

호출되는 시점 :  모든 FixedUpdate가 모든 스크립트에 호출된 후 

특징

1.  당연히 yield코루틴 명령문에서만 사용 가능

 

OnTriggerXXX, OnCollisionXXX

특징은 여기서 정리했다.

https://funfunhanblog.tistory.com/13

 

유니티) 충돌체크 OnTriggerEnter , OnCollisionEnter (Collider, Collision) #2Roll a Ball 로 연습하기

OnTrigger , OnCollision 비교하기 Collider 유니티에서 충돌체크를 하기 위한 필요한 컴포넌트이다. 3D오브젝트를 생성하면 Collider가 자동적으로 추가 되어있다. 먼저 Trigger에 대해 살펴보자 1) void OnTrigg..

funfunhanblog.tistory.com

 


 

 

Input events


OnMouseXXX

특징 : 마우스입력으로 호출되는 이벤트함수

 


Unity) 유니티 이벤트실행순서 / 플로우차트(Script Lifecycle Flowchart) #2

https://funfunhanblog.tistory.com/253

 

 

 

 

 

유니티 - 매뉴얼: 이벤트 함수의 실행 순서

자동 메모리 관리를 이해하기 이벤트 함수의 실행 순서 Unity 스크립팅시, 미리 정의된 순서대로 실행되는 많은 이벤트 함수가 있습니다. 아래에서는, 실행 순서를 설명합니다. 에디터 __ Reset : __ Reset은 개체가 처음 연결되었을 때 스크립트의 프로퍼티로 초기화하는 데 호출됩니다. Reset 명령을 실행했을 때도 마찬가지입니다. 첫 번째 씬 로드 이 함수는 씬이 시작되면 호출됩니다(씬의 각 오브젝트에 대해 한 번). __ Awake : __이

docs.unity3d.com

반응형

어떤 임의의 URL을 입력하면 JSON형식의 텍스트를 반환하는 API서버

 

프로젝트 생성

cmd터미널에서 mix new 명령으로 새프로젝트를 생성한다.

그러면 아래 처럼 내컴퓨터의 생성한 프로젝트 이름으로 폴더가 생긴다.

 

생성한 디렉터리로 들어가서 구조를 확인해봤다.

 

 

의존 라이브러리 추가하기

mix.exe파일에 끝에있는 deps함수를 수정한다. 프로젝트에서 의존하는 라이브러리를 추가하는 부분이다.

   나는 {:plug_cowboy , " ~> 1.0 " }, 이걸로 종속성을 수정해야 되었다.

 

밑에 mix명령어를 통해 로컬프로젝트 속으로 import시킨다.

 

 

다음은 application함수를 아래와 같이 수정하자

이 프로젝트에서사용될 어플리케이션들을 선언하는 부분이다.

 

아래와 같이 입력하면 iex 입력으로 바뀐다.

이 상태에서 앞서 mix설정에서 추가한 웹서버인 CowboyHTTP서버를 실행하자

아래 명령문을 통해 실행한다.

웹브라우저를 통한 확인

잘나오면 MyApp모듈이 Cowboy웹서버와 연동이 된것이다. 

 

 

API 서버 구현

URL/users/tom을 호출하면 사용자 프로필 정보를 JSON형식으로 출력하는 간단한 API서버가 된다.

my_app.ex파일 수정

get " /users/:name" do부분에서 URL맵핑을 통해 웹요청을 처리하고,

마지막 match _do부분은 이도저도 아닌 나머지 요청에 대한 처리(catch-all)루틴이다.

'|>'sms Elixir의 파이프 연산자이다.

 

명령행에서 API 서버 실행

IEx에 접속하여 Cowboy업데터를 호출하는 방법이 아닌 명령행에서 직접 API서버를 실행할 수 있도록 해보자

mix.exe파일을 열어 application함수를 아래와 같이 변경하자

mod키를 추가하여, 어플리케이션이 시작될 때 실행할 시작 모듈을 MyApp으로 지정하였다.

 

메인코드로 와서 start함수를 추가하자(어플리케이션이 시작될때 호출되는 함수다)

마지막으로 터미널에서 다음과 같이 mix run 명령어를 실행하면,

 

학습참고 

https://www.usefulparadigm.com/2017/02/03/building-a-json-api-server-using-elixir-and-plug/

반응형

 

all? 

아이템 요소가 모두 만족해야 한다.

 

any? 

하나라도 만족하면 true를 반환한다.

chunk_every

컬렉션을 입력한 숫자로 쪼개기

 

chunk_by

열거할수 있는 함수를 받아와서, 주어진 함수의 결과 값이 변할 때 마다 그룹을 새로 시작한다.

map_every

모든 n번째 아이템을 가져오며, 항상 첫번째 것에도 적용한다.

 

each

새로운 값을 만들어내지 않고 컬렉션에 대해 반복한다.

 

map

각 아이템마다 함수를 적용하여 새로운 컬렉션을 만들어내고자 할때

 

min

컬렉션 내의 최소값

max

컬렉션 내의 최대값

 

reduce

컬렉션을 하나의 값으로 추려낸다. 선택사향으로 축적자를 함수에 전달이 가능하다.

 

sort

컬렉션 정렬

1)함수 사용x

2)함수 사용

 

uniq_by

열거 가능한 집합 내의 중복요소를 제거

 

 

Elixir School

프로그래밍 언어 Elixir 배우기

elixirschool.com

 

반응형

운영체제 

교착상태

-  두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 떄문에 결과적으로 아무것도 못하는 상태

- 다중 프로그래밍 환경에서 흔히 발생할 수 있는 문제이다.

 

다중 프로그래밍 : CPU작업과 입출력 작업을 병행하는 것(메모리에 여러개의 프로그램을 상주시켜 하나의 CPU로 연산과 처리를 중첩시켜 CPU유휴시간을 감소하기 위한 기법

 

교착상태의조건

1. 자원점유와 대기

프로세스가 자신이 가질 수 있는 자원은 가지고 있으면서 다른 자원이 오기를 기다리는 것

 

2. 비선점

다른 프로세스에 할당된 자원은 사용이 끝날 때 까지 강제로 빼앗을 수 없다.

 

3. 순환대기

프로세스의 자원 할당에서 첫 번째 프로세스와 마지막 프로세스의 자원할당이 겹치게 되어 원형에 있는 모든 프로세스가 자원 할당을 받고자 기다리는 형태

 

4. 상호배제

한번에 한개의 프로세스만이 공유자원을 사용할 수 있어야 한다.

 

예방

1. 자원점유와 대기

프로세스가 실행되기 전 필요한 모든 자원을 할당하여 프로세스 대기를 없애거나 자원이 점유되지 않은 상태에서만 자원을 요구하도록 한다.

 

2. 비선점

자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때 점유하고 있는 자원을 반납하고, 요구한 자원을 사용하기 위해 기다리게 한다.

 

3. 순환대기

자원을 선형 순서로 분류하여 고유 번호를 할당하고, 각 프로세스는 현재 점유한 자원의 고유 번호보다 앞이나 뒤 어느 한쪽 방향으로만 자원을 요구하도록 한다.

 

4. 상호배제

한번에 여러개의 프로세스가 공유자원을 사용할 수 있도록 한다.

 

회피

교착상태가 발생하면 적절히 피하는 방법

 

각 프로세스의 요청과 방출에 대한 순서를 파악하고 있다면 우리는 각 요청에 대해서 가능한 미래의 교착상태를 피하기위해 프로세스가 대기해야하는 지를 결정할 수 있다는 점에 착안하여 나온 방법

즉, 어떤 프로세스가 요청을 할 때 미래에 대한 분석을 통해 나의 요청을 늦추는 방법으로 교착상태를 피할 수 있다.

 

 

 

 

 

 

학습참고 :

1. https://coding-factory.tistory.com/311

2. https://frontalnh.github.io

반응형

'STUDY > 운영체제' 카테고리의 다른 글

[컴퓨터 구조] 캐시이론 Locality  (0) 2021.09.23

스킬사용이 가능해진 상태에서 스킬키를 입력받으면 초록색 원형 이미지를 보여준다.

그리고 레이캐스트로 y을 고정하고 x와z값으로 마우스 위치를 받아 움직여주도록 했다.

 

 

사용은 마우스 왼쪽클릭을 한번더 하면 발동하도록 처리했다.

 

 

함수호출순서로는

 

1.업데이트에서 입력키 받음

2.등록된 스킬인지 확인,해당 스킬 mp가 현재 mp보다 작은지

스킬 State =true,기본 공격State = false,

3.이펙트 풀에서 스킬오브젝트 가져옴

4.사정거리 표시(하얀 테두리),  초록색테두리 위치 업데이트(Ray캐스트) / 테이블에서 데이터 가져옴

 

마우스 클릭

발동

6. 테두리들 오브젝트 크기 원위치,및 오브젝트 비활성화

7. 초록색테두리(마우스 위치)로 이펙트 게임오브젝트 상태 true

8. 스킬오브젝트 주위기준으로 가까운 거리에 있는 몬스터들에게 데미지 처리 -> 플로팅텍스트 등등

9. 플레이어 mp감소,MP UI업데이트 

10. 스킬슬롯 UI쿨타임 시작,(해당 스킬 State =false 쿨타임이 끝날때 까지)

 

발동 후

11.기본공격 State = true, 스킬공격 State = false

12.이팩트 오브젝트 비활성화

13. 쿨타임 다되면 현재 mp값과 스킬가능상태 or 불가능상태 체크

14. 스킬슬롯 UI 업데이트 

 

 

 

 

 

반응형

펙스오브엑자일 처럼 무기의 잼을 장착할 수 있도록 하고싶었다. 잼을 장착한 무기는 특정할 스킬을 쓸 수 있도록

대장장이 NPC를 만들고 거기에 무기와 잼을 끌어다 놓으면 잼 장착이 가능하도록 했다.

 

잼 장착

잼이 장착되면 아이템슬롯에서 어떤잼이 장착되었는지 볼 수 있고

잼의 맞는 이팩트가 추가된다.

 

그리고 잼스킬이 활성화 된다.

 

잼 장착 해제

잼이 장착된 무기를 끌어다 놓으면 장착된 잼이 잼칸에 보여진다. 그리고 해제가 되면 인벤토리 비어있는 공간으로 다시 돌아간다.

 

 

아이템 고유ID 부여

인벤토리에 들어온 아이템은 고유ID를 갖기때문에 잼이 장착된 잼과 그렇지 않은 잼 구별이 가능하도록 했다.

 

 

 

 

반응형

 

캐릭터 선택

 

선택하는 직업의 캐릭터의 림 라이트를 적용해서 어떤 캐릭터가 선택되었는지 표현하도록 했다.

잘 안보이는 것 같기도..

 

몬스터 피격

몬스터 피격도 어떤 몬스터가 피격당했는지 표현되도록 했다.

 

여러 몬스터들을 피격한 경우

 

 

 

몬스터는 몸통전체가 같은 메테리얼로 적용되어있어서 몸통 Renderer로 한 부분만 알고 있으면 되지만 히어로 캐릭터 같은 경우는 머리, 몸통, 팔다리가 모두 분리되어있다. 아마도 부위마다 변경이 가능한 리소스라 나뉘어있는 듯하다.

 

모든 몬스터들은 같은 메테리얼을 쓰기때문에 메테리얼을 바꾸면 피격당하지 않은 몬스터들도 림 라이트 효과가 들어간다.

 

피격당한 몬스터의 메테리얼만 바꾸도록 MaterialPropertyBlock를 사용했다. 

 

(MaterialPropertyBlock의 대한 내용은 따로 정리 해야겠다.)

 

 

 

반응형

 

 

우선 PPT로 행동트리를 그려봤다. 

공격패턴은 근접2개 그리고 원거리 이펙트공격,점프공격이있다.

 

BT대로 구현한 내용을 Gif로 보면

 

근접공격 사거리(true)-> 근접공격

 

원거리 공격 사거리(true)-> RandomAction -> 점프공격 (확률45%)

 

원거리 공격 사거리(true)-> RandomAction -> 플레이어 추적 (확률45%)

원거리 공격 사거리(true)-> RandomAction -> 원거리 공격 (확률10%)

 

위험 체력 체크(true)-> 스켈레톤소환 -> 체력회복

 

 

반응형

몬스터로밍 범위를 테이블 값으로 불러왔었는데 이게 확장성도 낮고 낭떠러지, 등등 불규칙적인 맵에 적용하기가 힘들다.

그래서 인스펙터창에서 로밍 범위를 정하도록 바꾸었다.

 

 

 

기즈모를 이용하여 몬스터가 어디로 로밍범위를 보여주도록 했다.

 

 

반응형

call by value(값에 의한 호출)

값을 복사해서 전달하기 때문에 원본의 값(매개변수로 넘겨준 값)이 변경될 가능성이 없다. 하지만 참조에 의한 호출보다는 고비용이다. 

 

call by reference(참조에 의한 호출) 

원본의 값의 변경이 될수도 있다. 

반응형

'프로그래밍언어 > C++' 카테고리의 다른 글

C++) 생성자와 소멸자  (0) 2020.06.10
C++)접근 제한자  (0) 2020.06.09
C) 배열/문자열과 포인터.  (0) 2020.05.02
C) 파일 입출력 (FILE,fopen,fclose)  (0) 2020.05.02
C) ASCII 아스키코드  (0) 2020.05.01

 

스킬북UI

UI 구성은 왼쪽은 일반 스킬, 오른쪽은 잼스 킬로 무기의 잼을 장착할 수 가있는데 잼이 장착된 무기로 가능한 스킬이 생기게 된다.

 

잼 장착은 대장장이 NPC를 통해 만들 예정

 

스킬등록

선택팝업창UI는 재사용.

스킬을 등록하기 위해서는 두가지 조건이 있다. 스킬등록 포인트가 있어야하고 이전 스킬 등록 여부

 

 

 

스킬등록이되면 실제 입력키를 받는 딕셔너리에 추가하도록 했다.

스킬등록 취소

스킬등록을 해제하면 담겨있던 딕셔너리에서도 제거하도록 했다. 실제로 입력키를 받지 않도록 하기 위해서이다.

이게 좋을까 아니면 딕셔너리는 그대로 둔 채 그 입력키를 무효화시키는 코드를 추가하는 게 좋을지

 

 

스킬사용

밑에 있는 스킬슬롯에 표시되어 있는 숫자1~8, 그리고 F1~F4까지 입력키로 스킬을 사용한다.

 

스킬 사용가능 조건 :

1. WeaponState가 0(맨주먹)이면 스킬 사용 불가능

2. 재사용시간이 경과되지 않으면 사용 불가능

3. Mp가 부족하면 불가능

 

 

1
2

 

3
스킬마다 소모MP가 다르기 때문에 사용 가능한 스킬만 활성화 되어있다.

반응형

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

비주얼 스튜디오 작업 중에 이런 오류가 났었다.

미리 컴파일된 헤더 파일이 이전 버전의 컴파일러에서 만들어졌거나 미리 컴파일된 헤더가 c++인데 c에서 사용하고 있거나 또는 그 반대의 경우입니다(Visual Studio 오류코드 C1853)

 

찾아보니 c파일과 cpp파일을 동시에 프로젝트에 삽입한 채로 빌드를 할 경우 이런 오류가 날 수도 있다고 한다.

 

 

 

오류 해결방법

 

'보기'탭 -> 솔루션 탐색기 (비주얼 스튜디오 처음 접하면 이거 찾는 경우가 많아서)

 

'미리 컴파일된 헤더 사용 안 함'으로 변경하기

 

안되면

컴파일 옵션 'C++ 코드로 컴파일'로 변경하기

 

반응형

일단 몬스터들은 마을맵에 몬스터 5종류?(고블린, 샤먼 고블린(원거리), 오크, 성난 돼지)

 

그리고 던전 씬의 2~3(보스 포함) 종류 정도 될 것 같다. 마을 씬에 입장하면 몬스터가 동적으로 생성된다. 그러 몬스터들은 각각 자기의 BT에 맞게 움직인다.

 

공격 판정

플레이어는 공격할 때 자기 공격 가능 범위(무기마다 다름)를 체크하고 그중에서 가장 가까운 몬스터들을 찾는다. (콜라이더를 사용하지 않음) 원래는 논타깃으로 플레이어가 정확히 몬스터가 있는 방향에서 공격을 해야 대미지 처리를 했지만 맞추기가 어려워 가장 가까운 몬스터가 있는 방향으로 회전하도록 했다.  

 

 

공격

공격은 기본 공격(히어로 공격력 + 무기 데미지)과 크리티컬 대미지 두 가지로 대미지를 입힐 수 있다. 크리티컬 확률은 플레이어 스텟인 크리티컬 확률로 나오도록 했다. 

 

 

UI처리

UI는 공격하고 있는 몬스터의 이름, 방어력, 체력을 뜨는  UI가 있고, 데미지 값을 보여주는 플로팅 텍스트가 있다.

플로팅 텍스트는 애니메이션 효과와 크리티컬 대미지인 경우 좌우로 흔들리는 효과는 트윈으로 처리했다.

플로팅텍스트 애니메이션

애니메이션 : 스케일 -> Y값 조절 -> 잠시 멈춤 -> 알파 값 조절

 

 

 

 

반응형

몬스터 종류는 아직 생각한 건 몇 가지 없지만 일단 가장 기본적인 근접 공격 몬스터를 만들 계획이었다.

 

몬스터들의 애니메이션은 믹스 아모(https://www.mixamo.com/#/)에서 구했다. 참 좋은 사이트이다.

 

보스 몬스터가 아닌 기본 몬스터는 플레이어보다 매우 단순하다. Idle, Walk, Run, Die, Attack 이 정도?

 

그러고 이제 이 몬스터들은 상황에 맞게 움직이기 위해 BT를 적용했다.

 

몬스터 종류의 따라 다르지만 처음 제작한 고블린은 BT는 이렇게 구성했다.

 

먼저 죽었는지 판단하고, 그렇지 않으면 다음 행동 조건을 체크하면서 해당하는 해동을 실행하도록 했다.

그 체크 조건들은 1) 공격 사거리인가? 2) 발견 거리인가? 3) 플레이어가 살아있나?

 

 

 

사실 조금 헤맸던 게 Sequence순서의 따라 동작이 의도했던 대로 안될 수가 있었기 때문에 시간이 걸렸던 것 같다. 

 

예를 들어 Sequence4와 Sequence순서가 바뀌었다고 가정하고 행동을 예상해보면 몬스터는 발견 거리가 되면 플레이어에게 달려간다. 그러고 원래라면 공격 거리가 되면 공격을 해야 하는데 계속 달려만 갈 것이다. 

 

공격 거리는 발견 거리보다 당연히 작을 수밖에 없기 때문에 Sequence6만 계속 실행될 것이다.

(물론 다른 BT함수를 만들거나 변형하면 될 수도 있지만 나는 생각이 안 났다.) 

 

 

로밍 (Squecne6)
추적 Squecne4,Squecne5
공격->추적->로밍

 

반응형

일단 퀘스트는 총 4가지 상태로 나뉜다. 

1) 받기 전

2) 받은 후

3) 완료

4) 현재 퀘스트와 관련 없는 상태

 

1) 받기 전 (퀘스트 수락)

캐릭터를 새로 생성하고 마을 씬에 들어오면 첫 번째로 퀘스트가 주어진다. 

오른쪽에 알림창같은 팝업으로 퀘스트 이름, 퀘스트 설명, 달성 현황이 표시되도록 했다.

NPC에게 받음

 

퀘스트 상태에 따라 대화 상자의 버튼과 NPC머리위 아이콘이 달라진다.

 

퀘스트를 받은후

 

퀘스트 받기 전  /  퀘스트 완료 후 

아이콘

받기 전&관련 없는 상태는 대화 상자 아이콘

받은 후는 물음표 아이콘,

퀘스트 완료상태인데 보상받기 전은 느낌표 아이콘을 보여주도록 한다.

 

받기전
받은 후

 

완료 후


2) 받은 후 (퀘스트 진행상태 로그 창)

퀘스트 로그 창을 단축기를 통해 열면 현재 받은 퀘스트 목록들을 볼 수 있다. 보상 아이템과 보상 골드, 보상 경험치 등을 확인할 수 있다.

4) 완료 (퀘스트 달성)

퀘스조건을 만족하면 퀘스트알림창과 퀘스트 로그창에 완료표시가 보여진다.

 

 

반응형

 

인벤토리 아이템 정보창

 

인벤토리에서 어떤 아이템인지 표시해주고 그 아이템의 대한 설명이 필요하다.

당연하지만 모든 아이템은 가지고 있는 정보가(공격력, 방어력, 회피율 등등) 다르다.

클릭하면 재생됨

 

 

아이템타입 enum

 

여기서   모든 아이템은 아이템정보창을 하나로 쓰기에 발생되는 문제? 가있다. 

  아이템 타입의 따라 출력되는 정보가 다르기에.  해당하는 아이템의 정보가 아닌 경우 '0'으로 표시될수가 있다. (ex 무기인데 방어력이 표시되는 경우 기획에 따라 다를수있긴 하지만)

 

먼저 모든아이템들이 공통적으로 입력되는 것은 Sprite이미지, 아이템이름, 아이템 설명

 

아이템 타입의 따라 분류를 해보자

무기 타입일 경우 무기 타입, 무기 등급, 공격력, 크리티컬, 공격 속도, 무기 등급

방어구 타입은 방어구 타입, 방어구 등급, 방어력, 회피율, HP

 이런 식으로 나뉘게 된다.

 

해당하는 아이템의 능력치에 해당하는 Text는 켜주고 그렇지 않은 능력치인 경우는 꺼주는 과정이 필요하다.

그런데 이렇게 해도 또 문제가 발생한다.

 ----------------

공격력

공격 속도

방어력

체력

----------------

UI Text가 이런 식으로 배치되어있는데 여기서 공격력과 체력만 사용하면 중간의 공격 속도와 방어력은 오브젝트를 꺼주는데 그럼 중간에 텅 비게 된다.

----------------

공격력

 

 

체력

----------------

이런 식으로 표시될 거다.

이문제는 Grid Laydout Group를 이용하면 해결이 가능하다.

 

장착 아이템 수치 표시

장착을 하면 현재 캐릭터의 수치를 표시해줘야 한다.

예를 들어 체력 : '히어로 체력+아이템 스텟'  '(+ 아이템 스텟)' 이런 식으로 능력치를 표시한다.

 

클릭하면 재생됨

 

 

여기서도 당연히 아이템을 장착할 때 스텟 값을 변경하는 과정에는 여러 가지 경우가 있다. 

 '(+ 아이템 스텟'

아이템을 장착/해제할 경우 :  현재 장착되어있는 모든 아이템들의 정보를 계산하여 표시 

'히어로 체력+아이템 스텟'

여기서 그냥 현재 히어로 스텟에 아이템 스텟을 더하면 안 된다. 그 아이템을 뺄 경우와 아이템 능력치가 곱하기나, 나누기, 퍼센트로 들어갈 경우가 있기 때문에 원본 스텟을 복사하여 사용하는 게 좋다. 원본스텟은 레벨업을 할경우?를 제외하고는 건들지 않도록 하는게 좋다.

반응형

무기 타입은 총 8가지

맨손, 한손검, 양손검, 메이스, 한 손 창, 양손 창, 한 손 도끼, 양손 도끼가 있다.

 

일단 한 손무기중에서 공격애니메이션을 제외한 대기,이동,점프등등 같은 애니메이션을 사용하고 공격애니메이션은 메이스와 한손도끼는 비슷하기에 같게 만들었다.

한손검은 다른 한손 무기 애니메이션보다 속도가 빠르다.

 

무기 리소스 모양의 무기 타입을 맞추는 것이라 시간이 들었다. 

플레이어 애니메이터

WeaponState로 무기가 스왑 되면 해당하는 애니메이션으로 넘어가도록 했다.

무기 스왑

무기 타입별 애니메이션

각 무기타입별 애니메이션은 아래와 같은 구조로 4개의 서브 스테이트로 다시 분류된다.

공격 애니메이션

마우스 좌측으로 연속 입력의 따라 3단 공격까지 가능하다.

 

무브 애니메이션

 

스킬 애니메이션

 

생활 콘텐츠용

 

반응형

UI오브젝트의 위치를 지정하는 것은 월드맵의 존재하는 오브젝트들의 위치를 변경하는 것과 다르다.

 

월드맵의 존재하는 오브젝트 Transform의 Position의 값으로 위치를  지정해준다.

 

 

하지만 UI는 아래와 같이 Rect Transform으로 위치를 지정해준다  

 

 

UI는 단말기의 보여지는 사각형의 스크린 뷰로 Canvas밑에서 관리된다. 그렇기에 다른 방법으로 위치를 지정해줘야 한다.

 

RectTransform으로 접근한 뒤 anchorePosition으로 접근해서 값을 지정해줄 수 있다.

 

 

 

 

추가적으로 ) RectTransform

Anchors사각형 왼쪽 하단 모서리와 오른쪽 상단 모서리의 앵커

Min :  사각형 크기의 일부로 정의되는 사각형 왼쪽 하단 모서리의 앵커 포인트. 0,0은 상위 사각형 왼쪽 하단 모서리의 앵커에 해당하고 1,1은 상위 사각형 오른쪽 상단 모서리의 앵커에 해당

 

Max :  사각형 크기의 일부로 정의되는 사각형 오른쪽 상단 모서리의 앵커 포인트. 0,0은 상위 사각형 왼쪽 하단 모서리의 앵커에 해당하고 1,1은 상위 사각형 오른쪽 상단 모서리의 앵커에 해당

 

Left, Top, Right, Bottom : 앵커를 기준으로 한 사각형 에지의 상대적인 포지션으로, 앵커에 의해 정의되는 사각형 안의 패딩

https://docs.unity3d.com/kr/current/Manual/class-RectTransform.html

반응형

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

C#기본 문법이긴 하지만 그래도 컴파일 오류이기 때문에 포스팅했다.

 

우선 파셜 클래스의 대해서 알아보자  

파셜 클래스?

동일한 클래스명을 두고 이를 partial로 선언하는데, 컴파일러는 나중에 이를 합쳐 하나의 클래스로 인식한다.

 

그럼 언제 쓸까?

한 클래스에 여러 내용들이 있을 때, 또는 특징을 분할하여 가독성을 높이거나 여러 사람이 한 클래스를 작성할 때 사용하기도 한다고 한다.

 

 

나는 Character를 상속받는 Monster클래스를 세팅/행동으로 클래스 기능으로 두 개로 나누었다.

 

 

문제점 :  오류의 원인은 파셜로 만든 두 클래스가 다른 부모클래스를 상속받고 있었다.

 해결방법 : 같은 부모를 상속받도록 Character로 수정하니 해결됐다.

 

+) 파셜은 클래스만 아니라 인터페이스,구조체도 가능하다.

 

느낀 점 : 파셜클래스는 기존에도 사용했지만 다시 한번 찾아보게 되었다. 인터페이스나 구조체도 사용이 가능하다는 것도 알게 되었다. 

반응형

콜라이더 그리드 관리

 

월드맵에서 모든 땅 포함 오브젝트 콜라이더 유지 비용을 줄이기 위해 그리드 형식 콜라이더를 켜주고 꺼주는 시스템을 만들었다. 플레이어가 없는 위치의 콜라이더가 활성화될 필요가 없기 때문이다.

 

플레이어가 위치한 그리드를 제외한 모든 다른 그리드에 포함된 오브젝트의 콜라이더는 꺼주도록 한다. 

 

 

월드맵

활성화된 그리드는 초록색 비활성화된 그리드는 빨간색으로 기즈모 색상을 변경하여 보여주고 있다.

크기는 12x12로 총 144개의 그리드로 나누고 한 그리드당 스케일 값은 50이다. 

그리드는 플레이어가 위치한 그리드를 중심으로 최소 4개(가장자리에 있을 때)~최대 9(자신 포함 8방) 개까지 켜준다.

 

월드맵의 총 3천개 이상의 오브젝트들이 있으며 게임시작과 동시에 각오브젝트의 위치를 통하여 그리드로 관리된다.

 

 

반응형

RPG 게임이기에 플레이어는 NPC는 몬스터 등 상호작용할 객체들이 많다.

그렇기 때문에 인터페이스 인터렉션을 만들어 사용하면 꽤 좋을 것 같다고 생각했다.

 

일단 플레이어와 상호작용하는 기본들이다.

1. InterType : 인터렉션타입 (NPC, 몬스터, 아이템 루팅 박스 등등

2. enable : 이 객체와 플레이어가 인터렉션을 사용할수 있는지 상태 체크용

3. InterString : 나는 그 객체를 상호작용 시도할 수 있다는 상태를 보여주기 위함으로 썼다.

4. sInterPlayerAni : 이 객체를 만났을 때 플레이어가 취하는 애니메이션들을 가지고 있다.

5. ShowInter() : InterString과 마찬가지로 이상태가 되면 객체가 발생하는 행동들이 있다.

6. ActionKey() : 5번이 활성화된 상태에서 2번 조건이 true이고 플레이어가 액션키 버튼을 누르면 실행되는 행동

7. EndIter() : 인터렉션이 끝난 후 처리

8. NonShowInter() : 5번과 반대되는 경우 

 

사용 

NPC와 대화

 

1. InterType : NPC(대화하기) 

3. InterString : 대화하기

5. ShowInter() : NPC 손 흔들기 애니메이션, 인터렉션 UI상태 true 

6. ActionKey() : 5 플레이어가 F키 누르면 NPC는 대화하는 애니메이션을 작동하고, 퀘스트 창을 출력 , 카메라 줌인

7. EndIter() : 퀘스트 창 닫고, 카메라 줌아웃

8. NonShowInter() : 인터렉션 UI상태 false

 

생활컨텐츠 : 벌목

 

반응형

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

갑자기 나타난 오류. 코드 상의 오류는 아닌 것 같았다. 

문제점 : Assertion failed on expression: 'task.rasterData.vertexBuffer == NULL'

찾아보니 무기효과에 사용된 파티클에서 에러가났었다. 원래 잘됐었는데...

 

 

문제의 원인이 무엇인가 찾아봤다. 3.5이하 버전에서 나타는 오류라고 한다.

 

해결방법  : 3.5이상 버전업으로 해결했다.

 

느낀 점  : 코드이외의 나타나는 오류는 원인을 예측하기도 힘들고 해결방법도 쉽지 않다. 다행히 나 말고도 이런 오류를 발생하는 다른 사람들이 올려놓은 질문들로 해결을 하긴 했다. 그리고 버전을 변경하는거 자체가 많은 리소스등 많은 오류를 가져올 수 있어서 걱정헀지만 다행히 큰 문제들은 없었다. 

반응형

인벤토리 아이템 개수가 보이는 슬롯의 개수를 초과했을 때 스크롤 뷰로 처리하면 된다.

적용방법

생성 or 기존 이미지의 컴포넌트 추가

추가할 때는 UI -> Scroll View을 만들어준다.

나는 기존의 만든 이미지의 컴포넌트를 추가했다.

 

컴포넌트 살펴보기

Movement Type : 밑에 설명

Viewport : 표시하고자 하는 콘텐츠가 보일 배경? 공간

Content : 표시하고자 하는 슬롯

Scrollbar Horizontal/Vertical :  수평/수직 스크롤바

 

나 같은 경우는 수평 스크롤바는 필요 없으니 뺐다.

쉽게 슬롯들은 Content자식으로 넣어두면된다.

(Grid LayOut을 이용해 슬롯을 정렬)  

 

Movement Type

Unrestricted : 콘텐츠들이 드래그한곳으로 움직이며, 되돌아오지 않음

Elastic : 스크롤 영역 밖으로 나가도  다시 돌아옴

Clamped : 아예 못 나감

 

스크롤바와 Grid LayOut은 다른글에 포스팅하도록 해야겠다.

반응형

문제점 : 빨간색 / 해결방법 : 파란색 / 느낀 점 : 녹색 

 

이미지를 아틀라스 패킹하고 잘 로드되고 있다고 뜬금없이 몇몇의 이미지들이 뒤집혀 나왔다. 

 

아틀라스 오류? 패킹 과정 중에 오류? 인지 생각해보고 구글 검색을 했다. 검색으로 원하는 답변은 얻을 수 없었고, 아틀라스 프로퍼티타입을 위에서부터 하나하나씩 무슨 기능인지 확인했다.

 

유니티도큐먼트

확인과 동시에 내 아틀라스 설정과 비교하던 중 Allow Rotation이 체크되어있었다. 

 

체크를 해제하니 다시 원상태로 돌아왔다. 디폴트 값으로 체크가 디폴트 값이었다.

 

(유니티) 툴의 모든 프로퍼티의 기능들을 모르고 있을 때 이런 문제가 생기면 코드 상의 오류보다 해결하는데 더 많은 시간이 투자될 수도 있다. 최대한 많이 부딪혀보고 삽질도 많이 하다 보면 많은 경험과 노하우가 생길 것 같다 그전까지 열심히 개발과 공부를 해야겠다.

반응형

 

 

쉐이더코드

 

C# 유니티 스크립트 


2D이미지의 붙어있는 머테리얼

(obj는 Image)

쉐이더코드 변수의 값 받아오기

GetFloat("변수이름");

 

 

쉐이더코드 변수의 값 변경하기 

SetFloat("변수 이름", 변경할 값);


 

3D모델

1. material

2. sharedMaterial

두가지 접근방법이 있다.

 

material은 해당 오브젝트의 머테리얼만

sharedMaterial은 해당 머테리얼을 포함한 모든 오브젝트의 값을 변경하게된다.

material은 사용할때 각각으로 인스턴싱하기 때문에 배칭이 안된다. 

 

반응형

셰이더코드없이 노드구조로 셰이더효과를 낼 수 있는 어셋

 

어셋을 활용하기 위해서는 쉐이더의 기본용어는 알아두는게 좋다

UV좌표 : 텍스쳐 이미지를 3차원 공간의 폴리곤에 입히기위해 변환 기준이 되는 2차원 좌표계

UV 매핑 : D:2차원 그림을 3차원 모델로 만드는 3차원 모델링 프로세스

(자세한설명  https://kblog.popekim.com/2011/12/03-part-1.html)

 

그래픽스 파이프라인

3차원 컴퓨터 그래픽스에서 그래픽스 파이프라인(graphics pipeline) 또는 렌더링 파이프라인(rendering pipeline)은 3차원 이미지를 2차원 래스터 이미지로 표현을 하기위한 단계적인 방법

 

Shadero Sprite - 2D Shader Editor 사용방법

어셋다운로드

에셋을 다운로드하고 열면 이런 에디터화면이 나온다. 여기서 작업을하게된다.

Build Shader 생성

마우스 오른쪽 클릭 -> Build Shader 선택

 

Shadero Sprite Shader 스크립트 생성

유니티 프로젝트창에서 마우스 오른쪽 클릭

쉐이더 코드를 적용할 머테리얼도 같이 생성

 

쉐이더 코드 넣기

아까 생성한 쉐이더코드를 드래그앤드롭으로 놓는다.

머테리얼도 넣어둔다

 

적용할 이미지(텍스처) 추가

New Texture를 누르고 Select를 통해 원하는(쉐이더를 적용할) Sprite이미지를 선택한다.

 

Build Shader로 선을 이어준다

그러면 우측상단에 결과적용 이미지가 출력되는것을 볼 수 있다.

 

 

기본적인 효과설명

4Gradients

위치마다 다른 그라데이션효과

Twist UV 효과 UV->FX(UV)

Burn 효과  RGBA -> FX -> Burn FX

PlasmaFX

Gold효과

적용방법

쉐이더코드를 머테리얼에 적용후 그 머터리얼을 sprite에 적용

 

번외

쉐이더 그래프

유니티자체에도 쉐이더를 노드구조로 그리는 기능이 있음

프로젝트 생성할때 설정해주고 만들어야 쉐이더 그래프를 사용이 가능하다.

2018버전 Preview
2019버전 이상

튜토리얼 https://www.youtube.com/watch?v=VvK7sLbbLYE

 

반응형

+ Recent posts