반응형

내적(Dot Product)이란?

-      정규화된

한 벡터가 다른 벡터에 투영된 길이 값을 나타낸다.Ex) Dot(A , B) ? BA위치로 회전했을 때 투영되어 직교되는 위치만큼의 크기 값

 

EX2) Dot(B,A)는?

    

 

 

각 벡터를 Normalize한 후의 스칼라 곱의 결과값이며 그 값은 두 벡터의 코사인의 값과 일치한다. 그러므로 음수 인지 양수 인지 그리고 각도의 크기 값도 알아 낼 수 있다.

 

 

1.    먼저 3D맥스상에서 임의좌표를 가지는 두 개의 벡터를 만든다.

C = [5 , 2, -3]

D = [8, 1, -4]

    

2.    먼저 AB의 크기를 구한다.

 

3.    벡터의 크기 값을 활용하여 정규화(Normalize)를 한다.

 

||Normalize A|| = 1 이어야 한다! 

||Normalize B|| = 1 이어야 한다!

 

 

4.    두 벡터의 내적  A

B 을 구해 보자

A B = a1b1 + a2b2 + a3b3

= [(0.811 x 0.889) + (0.32 x 0.11) + (-0.487 x -0.444)]

= 0.72 + 0.035 + 0.216

= 0.971

 

 

 

5.    이제 내적의 결과값으로 여러가지 결과를 도출할 수 있게 됬음.

         내적의 결과 값으로 알게 된 결론은?

Dot(A,

B) > 0이면

 세타 값은 90도 이하

이므로 BA로부터 90도 각도 안에 있음을 알게 됐다.

 

è

이 결과는 게임로직에서 상당히 많이 사용될수 있다. A가 카메라이고 B가 오브젝트일경우 내적의 결과값이 양수라는 것은 BA의 시야안에 들어옴을 의미하고, 음수라는 것은 BA의 시야안에 들어오지 않음을 의미한다.

 

è

이 결과값을 토대로 디렉셔널 라이트와 오브젝트의 법선 벡터를 고려 했을 때 오브젝트가 빛을 얼마만큼 받고 있는지도 알 수 있게 됐다.

 

A가 디렉셔널 라이트이고 B가 법선 벡터를 가지고 있는 오브젝트라고 했을 때

 

이 정도의 빛을 받는 오브젝트임을 알 수 있다.

 

하지만, Dot(A, B)  = 1이라고 한다면

복사량이 최대치가 되어 가장 많은 빛을 받는 상황이 된다. 12시에 떠있는 태양이라고 생각하면 이해가 빠를 듯~

 

Dot(A, B) 

= 0이라면..

빛을 전혀 받지 않는 연산임을 알 수 있게 됐다. 12시가 되겠다.

 

 

코사인 각도와 노멀라이즈 된 내적의 각도 값은 일치하므로              코사인 각도는 맥스의 Listner 창을 활용해서 쉽게 알 수 있다.

          

           두 벡터 사이의 각도가 13.832도 라는 사실도 알게 됐다.

 

내적연산은 가볍다보니 셰이더 프로그램이나 물리 스크립트 에서도 굉장히 자주 쓰이는 기본적인 연산입니다~^^

 

 

 

Cg언어에 내장된 기본적인 Dot 공식- 두 벡터에 대해 -1 ~ 1 범위의 float 값을 얻을 수 있다. -1은 평행하며 나에게서 멀어지는 벡터, 1은 평행하며 나를 향해 다가오는 벡터, 0은 나와 완전히 수직인 벡터를 의미한다.

 

 

 

 

위에서 힘들게 구한 공식을 맥스 리스너(Max Listner)에서 쉽게 확인 할 수 있다.

 

 

반응형
반응형

참고  -http://book.naver.com/bookdb/book_detail.nhn?bid=7525807

 

Properties 개념 익히기

-       셰이더 프로그래머가 직접 규격에 맞춰 GUI 요소를 셰이더 코드에 빠르게 추가할 수 있다. Properties 블록에서 선언한 프로퍼티는 셰이더 코드에서 값, 색상, 그리고 텍스쳐를 변경하는 데 사용할 수 있다.

           Properties

           {

                     _EmissiveColor ("Emissive Color", Color) = (1,1,1,1)

                     _AmbientColor ("Ambient Color" , Range(0,10)) = 2

                     _MySliderValue ("This is a Slider", Range(0,10)) = 2.5

           //         변수 이름          인스펙터GUI이름   타입      기본값

           }

 

프로퍼티 타입 정리

Range(min, max)

최솟값부터 최댓값까지의 범위를 float프로퍼티의 슬라이더를 만든다.

Color

Inspector탭에 Color =(float , float, float, float)를 선택할 수 있는 색상 견본을 만든다.

2D

셰이더로 드래그할 수 있는 텍스쳐 견본을 만든다.

Rect

2의 승수가 아닌 텍스쳐 견본을 만든다. 2D GUI 요소와 같은 기능을 한다.

Cube

Inspector 탭에서 셰이더로 드래그할 수 있는 큐브맵(cube map) 견본을 만든다.

Float

Inspector 탭에 슬라이더가 아닌 float 값을 만든다.

Vector

방향, 색상을 만들 수 있는 4개의 float 프로퍼티를 만든다.

 

 

 

http://docs.unity3d.com/Manual/SL-Properties.html

 

SubShader 개념 익히기

_EmissiveColor , _AmbientColor, _MySliderValue 값을 SubShader{}에서 사용하기 위해서는 프로퍼티의 변수 이름과 똑 같은 이름으로 새로운 변수 3개를 만들어야 한다. 이렇게 하면 동일한 데이터로 작업할 수 있도록, 기존 변수와 새 변수 사이에 자동으로 링크를 설정한다.

                     float4 _EmissiveColor;

                     float4 _AmbientColor;

                     float _MySliderValue;

 

Surf 개념 익히기

SubShader 에서 변수를 만들면, surf{} 함수에서 값을 사용할 수 있다.

c = pow((_EmissiveColor + _AmbientColor), _MySliderValue);  

 

Properties , SubShader , Surf에 대한 세 가지 개념만 확립하면 디퓨즈 컴퍼넌트를 요구하는 셰이더를 만들기 위한 기반이 확립된다.

 

 

세 가지의 기본적인 사항을 파악하고 아래의 코드를 작성하면 기본적인 셰이더를 만들 수 있다.

Shader "Custom/BasicShader" {

Properties

 {

  _EmissiveColor ("Emissive Color", Color) = (1,1,1,1)

  _AmbientColor ("Ambient Color" , Color) = (1,1,1,1)

 _MySliderValue ("This is a Slider", Range(0,10)) = 2.5

 }

SubShader {

 Tags { "RenderType"="Opaque" }

LOD 200

                    

 CGPROGRAM

#pragma surface surf Lambert

 

float4 _EmissiveColor;

float4 _AmbientColor;

float _MySliderValue;

 

 struct Input {

                  float2 uv_MainTex;

                 };

 

 void surf (Input IN, inout SurfaceOutput o) {

 float4 c;

c = pow((_EmissiveColor + _AmbientColor), _MySliderValue);                               

 o.Albedo = c.rgb;

 o.Alpha = c.a;

 }

ENDCG

 }

 FallBack "Diffuse"

}

 

반응형
반응형

최근 한 대학에서 온라인 강의를 진행했습니다.

진행한 내용중 3DMAX를 활용하여 짐벌락을 설명하는 내용입니다. 

 

 

반응형
반응형

회사 디지이너들과 프로그래머들에게 물리기반 셰이더(PBS)에 대한 이해를 돕고자 진행항 PPT

 일시 : 2015년 7월 14일 대회의실

 

참고자료 -[Ndc13]Ndc 2013 김동석:UDK로 물리기반 셰이더 만들기

 http://www.slideshare.net/jalnaga/ndc13ndc-2013-udk-19999169

반응형
반응형

 

 사장님께서 각 팀 팀장들에게 모바일 게임 최적화에 대한 교육 요청을 해주셔서 진행한 PPT입니다.

일시 : 2015년 12월 7일 대회의실

 

 

참고 자료

[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리

http://www.slideshare.net/agebreak/unite2015-47100325?related=1

 

유니티 그래픽 최적화, 어디까지 해봤니

http://www.slideshare.net/ozlael/graphics-opt-ndc?related=2

반응형
반응형

 

 

 

 

 

반응형

'Study' 카테고리의 다른 글

PYTHON 기본 창 띄우기 "Hello World!"  (0) 2016.06.24
외적 연산(Cross Product) 쉽게 이해하기  (0) 2015.12.31
내적 연산(Dot Product) 쉽게 이해하기  (2) 2015.12.30
삼각비의 기본  (0) 2015.12.18
반응형

대부분 삼각함수라고 하지만, 중3에 나오는 삼각비에 가까운 내용이기에 삼각비의 기본이라고 쓰겠습니다. 

 

 

반응형
반응형

빌드 테스트 중에 씬에러 발생으로 빌드를 못하다가 여러가지 뒤져서 알아낸 결과

Bulid Setting - > Player Setting 으로 들어가서

Stripping Level을 Disabled로 변경하자 빌드가 되었다~

원인은 분석중..

 

참고 사이트 - http://westwoodforever.blogspot.kr/2014/02/unityexception-failed-assemblies.html

 

 

반응형
반응형

스크립트 공부중..

회사에서 캐릭터 선택창에서 사용될 카메라 회전 구조를 정리하면서 짠 초기 코드지만, 나름 유니티 스크립트 개념을 깨워준 코딩임..ㅋㅋ

 

using UnityEngine;
using System.Collections;

public class FollowCam : MonoBehaviour
{
 
 public Transform target;     //추적할 타겟 게임 오브젝트의 Transform 변수
 public float dist = 10.0f;     // 카메라와의 일정 거리
 public float height = 5.0f;     // 카메라의 높이 설정
 public float dampRotate = 5.0f;     // 부드러운 회전을 위한 변수
 public float TurnSpeed;
 public float camPos;

 Vector3 V3;
 
 private Transform tr;
 // Use this for initialization
 void Start ()
 {
  //카메라 자신의 transform 컴포넌트를 tr에 할당
  tr = GetComponent<Transform> (); 
  TurnSpeed = 2f;
  camPos = 2f;
 }

 void Update()
 {
  Vector3 PositionInfo = tr.position - target.position;     // 주인공과 카메라 사이의 백터정보
  PositionInfo = Vector3.Normalize (PositionInfo);     // 화면 확대가 너무 급격히 일어나지 않도록 정규화~

  target.transform.Rotate (0, Input.GetAxis ("Horizontal")* TurnSpeed, 0);      //마우스 입력이 감지되면 오브젝트 회전
  transform.RotateAround (target.position, Vector3.right, Input.GetAxis ("Mouse Y")* TurnSpeed);     //마우스 Y(Pitch) 움직임 인지하여 화면 회전
  tr.position = tr.position - (PositionInfo * Input.GetAxis ("Mouse ScrollWheel")* TurnSpeed);     // 마우스 휠로 화면확대 축고
 }
}

 

마우스 회전시 카메라 좌우 회전~

오브젝트에 왼쪽마우스를 찍고 돌리면 회전~

훨로 카메라 확대 축고~ 

 

 

아래는 똑같은 형식의 모바일 터치 구현 스크립트

using UnityEngine;
using System.Collections;

public class TouchCameraControl : MonoBehaviour
{
 public Transform charTarget;
 private Camera cameratarget;
 private Vector2 PrevPoint;

 public float moveSensitivityX = 1.0f;
 public float moveSensitivityY = 1.0f;
 public bool updateZoomSensitivity = true;
 public float orthoZoomSpeed = 0.05f;
 public float minZoom = 1.0f;
 public float maxZoom = 20.0f;
 public float perspectiveZoomSpeed = .5f;
 private Transform tr;

 void Start ()
 {
  //카메라 자신의 transform 컴포넌트를 tr에 할당
  tr = GetComponent<Transform> ();
  cameratarget = Camera.main; 
 }

 void Update()
 {
  Vector3 PositionInfo = tr.position - charTarget.position;
  PositionInfo = Vector3.Normalize (PositionInfo);

  if (updateZoomSensitivity)
  {
   moveSensitivityX = cameratarget.orthographicSize / 5.0f;
   moveSensitivityY = cameratarget.orthographicSize / 5.0f;
  }

  Touch[] touches = Input.touches;

  if (cameratarget)
  {
   if (Input.touchCount == 1) {
    if (Input.GetTouch (0).phase == TouchPhase.Moved) {
     PrevPoint = Input.GetTouch (0).position - Input.GetTouch (0).deltaPosition;

     charTarget.transform.Rotate (0, -(Input.GetTouch (0).position.x - PrevPoint.x), 0);
     cameratarget.transform.RotateAround (charTarget.position, Vector3.right, -(Input.GetTouch (0).position.y - PrevPoint.y)*0.5f);

     PrevPoint = Input.GetTouch (0).position;
    }
   }
  }
  if (cameratarget) {
   if (Input.touchCount == 2)
   {
    Touch touchZero = Input.GetTouch(0);
    Touch touchOne = Input.GetTouch(1);

    Vector2 touchZeroPrevPos = touchZero.position - touchZero.deltaPosition;
    Vector2 touchOnePrevPos = touchOne.position - touchOne.deltaPosition;

    float prevTouchDeltaMag = (touchZeroPrevPos - touchOnePrevPos).magnitude;
    float touchDeltaMag = (touchZero.position - touchOne.position).magnitude;

    float deltaMagnitudediff = prevTouchDeltaMag - touchDeltaMag;

    tr.position = tr.position - -(PositionInfo * deltaMagnitudediff * orthoZoomSpeed);
   }
  }
 }
}

반응형
반응형

최근 마티네 작업중에 카메라밖에 있는 캐릭터일 경우 렌더링 되지 않는 문제가 발견됬습니다.

그것을 해결하기 위해서는 Always Tick PoseAlways Tick Pose And Refresh Bone 으로 설정을 변경해 주시면 해결 됩니다.

 

레벨-> 해당 스켈레탈 캐릭터의 디테일 옵션 -> Skeletal Mesh의 MeshComponent Updata Flag를 보시면

Always Tick Pose로 되어 있습니다.

해당 옵션의 설명을 보면 Always Tick, But Refresh Bone Transforms only when rendered 이라고 설명하고 있습니다.

번역  - 렌더링  경우에는 반드시 하지만 업데이트 에만 변환합니다....  한마디로 렌더링이 되어야 업데이트를 한다는 이야기입니다.

 

이 옵션을 Always Tick Pose And Refresh Bone으로 설정을 변경해 주시면 정상 출력이 되는데요, 이 설정은 렌더링 되든 안되든 항상 본의

트랜스폼을 감지하게 됩니다.

 

당연히 이 옵션이 Always Tick Pose보다 무겁기 때문에 모든 캐릭터에 켜주시면 안되고, 불가피하게 안나오는

캐릭터들에게만 체크해 주시기 바래요^^

반응형
반응형

 

FBX와 언리얼상에 애니메이션 속도가 다르게 재생되는 문제가 발생했습니다.

여러가지 확인해 본 결과 FBX의 샘플링 속도와 엔진에서의 샘플링 속도 차이로 생기는 문제였습니다.

매번 발생하지 않고, 간헐적으로 발생하는 문제인데요~

문제 발생시 Use Default Sample Rate 를 체크하고 임포트 해주면 문제가 해결됩니다.

 

반응형
반응형

시네마팀에서 마티네에서 애니메이션 레이어 기능이 필요하다고 하셔서 내용 연구하여 공유합니다.

 

1. 편집할 애니메이션 선택


 

 

2. 어셋 생성하여 시퀀스 추가

- 첫 포즈만 불러올지 애니메이션을 전체 불러올지 정할 수 있습니다.


 

 

3. 생성된 시퀀스 에서 모션 편집

- 정면을 보면서 걷는 모션을 왼쪽을 보면서 걷는 키를 만들어보고자 합니다.


 

4. 각 메뉴별 상세 설명

(1) 현재 편집 시퀀스 - 현재 모션이 저장될 시퀀스 입니다.

(2) 현재 편집 관절 - 키를 수정할 관절입니다.

(3) 뷰 상에서 로테이션, 포지션, 스케일 키등을 편집후 +키 버튼을 누르면 애니메이션 키가 적용됨

(4) 커브 에디터 - 맥스의 커브 에디터와 거의 흡사하며 그래프의 꺽임등을 수정할 수 있고, 키도 수정할수 있습니다.

(5) Roll , Pitch , Yaw의 각축의 락을 걸어 원하는 축에만 모션을 줄 수 있음

(6) 작업을 하다보면 그래프가 보이지 않는 곳으로 사라질 때가 있는데, 새로 고침이나 모두 표시 버튼을 눌러주면 보기 편하게 정리해 줍니다.

 

- 이미지를 클릭하시면 크게 보실 수 있습니다.

 

작업된 모션 영상

- 원래 정면을 보던 모션인데 위 기능을 활용하여 왼쪽을 바라보며 걷도록 수정해 봤습니다.

 

 

키 작업시 주의사항

- 맥스만큼 편하게 키를 제어하는 것은 어렵습니다.. 당연히 간단한 레이어 포즈 편집용으로만 사용해 주시는게 좋을거 같습니다.

1. 키 복사가 쉽지 않다. 맥스에서는 Shift 버튼으로 간편히 키 복사가 되지만, 언리얼에서는 그래프상에서 수치를 복사하여 사용합니다.

2. 키 편집 공정이 맥스와 매우 달라 숙지하는 시간이 필요함. - 틈틈히 연습이 필요해 보입니다.

3. 오토키(Autokey)가 아닌 셋키(Setkey) 방식입니다~  풀어서 설명하자면 모션을 움직인 후 반드시 키버튼을 눌러줘야 모션이 적용됩니다.

 

반응형
반응형

얼마전에 맥스의 프랍이 언리얼로 넘어가면서 y축으로 90도 돌아가는 문제가 있었습니다.

그 이유를 명확히 이야기 하자면 맥스와 언리얼의 좌표계가 다르기 때문입니다.

맥스 - 오른손 좌표게 , 언리얼 - 왼손 좌표계

 

 

여기서 오른손 좌표계와 왼손 좌표계에 대한 간단한 설명.

3차원 좌표계를 표현할 땐 보통 아래의 그림과 같은

왼손 좌표계(left-handed coordinate system)와 오른손 좌표계(right-handed coordinate system) 두 가지 방법을 이용합니다.

 

오른손 좌표계는 근 100여년 동안 표준적으로 사용되어온 방법입니다. 물리학계를 비롯해 OpenGL 등 대부분은 이 좌표계를 사용합니다.

왼손 좌표계를 사용하는 대표적인 사례로는 Direct3D가 있습니다.

 

이 두 좌표계를 외우는 방법은 다양하겠지만다음과 같은 방법으로 숙지하면 알기 편합니다.

 

  1. 박수 칠 때 처럼 양 손을 마주 보도록 펼친다. 이 때 엄지손가락은 나머지 손가락과 직각이 되도록 한다.

 

  2. 가운뎃손가락을 손바닥에 수직이 되도록 반 쯤 접고, 약손가락과 새끼손가락은 완전히 접는다.

 

  3. 마치 '쌍권총 자세'를 연상케하는 모양이 되었을 것이다.

 

     왼손은 엄지손가락부터 순서대로

 

     [엄지손가락-x, 집게손가락-y, 가운뎃손가락-z]

 

     오른손은 반대 순서로

 

     [엄지손가락-z, 집게손가락-y, 가운뎃손가락-x]

 

     이런 식으로 대응시킬 수 있다.

 

이 상태로 양 손의 집게손가락을 하늘을 향하게 해서 위의 그림에 나온 좌표계와 비교해보시면 똑같은 배치가 되어있음을 알 수 있습니다.

 


추가질문 - 다른 뼈들은 알아서 축정렬이 되서 잘 들어오는데 왜 소켓에 붙은 Prop만 그렇지?

그 이유도 간단합니다. 다른 모든 더미와 뼈들은 맥스에서 제작해서 넘어오기 때문에 알아서 부모축을 따라가면서

문제가 없지만, 무기에 붙은 소켓 더미는 언리얼에서 제작한 것으로 언리얼 원본 좌표를 따라갑니다.

거기서 프랍이 혼란을 갖게 됩니다.

프랍은 맥스에서 만든거라 오른손좌표계로 기억되어 넘어오지만, 언리얼에서 만든 소켓은 왼손 좌표계다 보니

축이 다르게 설정 되는 겁니다.

이 문제를 해결하기 위해서 무기 축 더미를 언리얼 소켓이 아닌 맥스에서 더미를 만들어 사용하게 되면

문제가 해결되는데, 현재 언리얼에서 쓰는 소켓 더미는 엔진상에서 많이 사용되고 있기 때문에 그 상태를 유지하도록 한겁니다.

 

반응형
반응형

*제작한 이펙트가 처음엔 잘 나오다가 시간이 지나면 알파값이 제대로 안빠지고 소팅도 안되는 문제가 발생하고 있습니다.  동시에 프레임도 떨어지고 있습니다. .(갤럭시s5, 넥서스5, G2 모두 발생)

 

 

원본 이펙트

 

 

빌드후 시간이 지나면서 문제가 발생하는 모습

 

 

여러가지 테스트를 거쳐 원인을 파악해 본 결과 파티클에 패너 함수가 적용되면서 값이 누적되면서 발생하는 문제로 추정됩니다.

파트클에도 움직임을 주고 쉐이더에도 움직임을 주면서 뭔가 문제를 발생하는거처럼 보입니다.

패너값을 0으로 놓고 파티클로만 움직임을 주고 빌드를 하면 문제가 발생하지 않습니다.




**이 문제의 해결방안~

이 문제점을 커스텀 UV를 사용하여 해결하였습니다.

기존에는 PANNER를 이미지에 바로 연결하여 UV애니메이션을 적용했는데, 모바일 빌드시에는 텍스처에 바로 연결하지 않고

커스텀 UV를 만들어 연결해줘야 느려지는 현상이 없어집니다.

반응형
반응형

모프타겟을 사용하여 마티네에서 표정애니를 추가할 수 있는 것을 확인했고, 모바일에서도 작동됨을 확인했씁니다.

 

이 작업이 들어가기전에 선행되어야할 중요한 사항.

- 모프타겟은 버텍스 애니라 연산부하가 있어 표정애니 넣을 부분만 파츠로 나눠서 적용한다.
- 얼굴만 따로 분리하니까 2400 poly 정도 됩니다. 몸 전체는 15000개 이상이라 그냥은 절대 넣을수 없음.PC에서도.. 퍼포먼스 테스트를 거친후 무리가 없다고 판단될때 게임에 적용.

 


작업 공정 가이드

1. Max 에서의 작업

맥스의 모퍼 기능을 활용해 필요한 표정들을 셋팅해 준다. 여기서는 테스트로 5가지만 넣었음.
모퍼의 장점은 모델러들에게 부탁해 원하는 표정을 버텍스를 이용하여 퀄리티 있게 마음껏 만들어 사용할 수 있다.

(1) 원본 모델 소스를 여러개로 복사해 원하는 표정의 모델링을 한다.

 

(2) 원본 모델 소스에 복사된 캐릭터들의 표정 데이터를 모퍼에 추가해 준다.

- 0~100의 수치를 조절하여 표정을 다양하게 꾸밀 수 있다.

 

(3) 맥스에서 익스포트시 체크사항

익스포트 스크립트를 사용하시면 안되고, 아래 사항을 체크하셔서 수동으로 익스포트 하셔야 합니다.

 

 

 

2. 언리얼에서 작업
 

(1) 임포트시 체크사항

- 모프타겟 체크


 

 

(2) 메쉬창에 모퍼 리스트가 뜨는지 확인

-맥스에서 지정한 모핑 리스트가 그대로 넘어왔는지 수치를 조절하며 테스트

 

 

(3) 페이셜을 추가할 시퀀스에 표정애니를 추가해줍니다.

- 모핑할 시퀀스를 추가 -> 변수 추가 -> 모퍼네임설정(수동으로 적으면 인덱스로 불러옴) -> 커브 추가로 애니 추가


 

- 커브 유형을 모프커브로 설정해 줍니다~ 설정안해주시면 애니가 안나와요~


 

(4) 마티네에서 표정애니가 추가된 시퀀스를 호출함

 

 

아래는 위 공정을 거쳐 마티네상에 표정애니를 추가해본 테스트 영상입니다.

 

반응형
반응형

1. 발사 모션을 상체에만 적용 시키기 위해 Fire라는 몽타주 애니메이션을 만들어 발사 Anim 파일을 적용시켜 줍니다.

 

 

제작된 몽타주 파일에 발사 모션을 연결해 준뒤 UpperSlot을 생성해 줍니다. - 상체모션만 넣기 위한 준비


 

 

 

2. 준비가 끝나면 Animation Blueprint로 와서 새롭게 코딩을 해줍니다.

- 애니메이션 블루프린트 제작할때 완료했던 모션을 캐시로 저장하여 메모리에 넣어줍니다.

 

 

-저장된 포즈를 불러와 사용합니다.

 

 

- 그 다음 '본 마다 레이어로 블렌드'를 불러옵니다.

 

- 블렌드의 세부 설정으로 가서 어느 본의 몇 번째 부터 블렌드가 시작될건지 정해 줍니다.

 

- 몽타주로 설정한 슬롯을 불러옵니다.

 

- 필요한 노드들이 전부 불러졌으면 최종적으로 연결해줍니다.

 

 

 

 

 

3. Animation Blueprint에서 제작된 것을 Character Blueprint에서 적용하도록 셋팅해 줍니다. 

위 그림처럼만 연결해주면 이제 발사버튼을 누를때 마다 볼사모션이 나옵니다.

이제 마지막으로 물리가 적용된 총알을 만들어 적용시켜 봅시다.

 

 

 

4. MyProjectile 이라는 물리가 적용된 총알을 만들어 줍니다.

물런 블루 프린트로~

 

 

 

5. 마지막으로 모바일 터치에 대한 부분과 총알 발사에 대한 부분을 캐릭터 블루프린트에서 코딩해 줍니다.

여기까지 마무리되면 모든 적용이 끝났습니다~!

언리얼은 계속 공부해 보고 싶은 엔진이긴 합니다..^^

 

적용이 완료되면 배경 오브젝트에 충돌이 일어나며 상하체 모션에 블렌드가 일어납니다~^^

 

 

반응형
반응형

- 게임모드 제작하여 게임속에 주인공 캐릭터 넣기

 

1. 게임모드 블루 프린트를 만든다.

- 이녀석은 아이콘에 따로 색이 안붙는거 같네요~

 

 

2. 디폴트 창에서 기존에 제작한 캐릭터 블루 프린트 연결하기


- 캐릭터 뿐 아니라 UI와 컨트롤러등도 내가 제작한 걸로 넣을 수 있습니다.

 

 

3. 월드 세팅에서 제작한 게임모드 불러 오기

여기까지 만들면 게임에서 뛰어다니는 주인공을 넣는데 필요한 모든셋팅이 끝났습니다.

 

 

PLAY~~!! 

 

 

근데 아무것도 든거 없이 맨손으로 필드만 뛰어다니니 왠지 심심하네요..

쓰는김에 발사모션 적용하는 방법과 총알에 물리 적용하는거 까지 같이 적어보겠습니다... To Be Continue..

 

반응형
반응형

 

*본 가이드는 4.6때 작성된것으로 최신버전과는 다소 차이가 있을수 있습니다.

**주인공 캐릭터 만들기 2번째

애니메이션 블루 프린트 만들기​



1. 주인공이 사용할 모션을 임포트해 옵니다.

​- 필수적으로 필요한 모션은 이동 모션(상,하,좌,우)과 대기모션과 발사모션입니다.

애니메이션 관련 문서

https://docs.unrealengine.com/latest/KOR/Engine/Animation/Sequences/index.html







2. 캐릭터 블루프린트를 제작하면서 사용된 원본 모델의 스켈레톤을 설정합니다.

블루프린트를 생성하려고 하면 스켈레톤 설정 화면이 나옵니다.

- 애니메이션 블루 프린트 파일. 이 녀석은 특이하게 주황색입니다. 

 

 


3. 주인공의 이동모션에 사용될 앞,,,우 모션을 블렌드 스페이스로 만들어 설정해 준다.


이미지를 클릭하시면 원본으로 보실수 있습니다.


- 필요한 모션들을 드래그앤 드랍으로 블렌드 제어창으로 넣을 수 있습니다. 여기에 필요한 대기, 이동관련 모션들을 넣어줍니다.


 



4. 주인공의 총구겨냥포즈에 사용될 앞,,,우 모션을 Aim Offset으로 만들어 설정해 준다.

 

- AimOffset은 강력한 포즈 저장기능이라 MeshSpace 형식으로 되어 있는 모션만 불러와서 사용할수 있다. 사용할 모션들을 전부 MeshSpace 형태로 바꿔줍니다.


 - 여기서도 필요한 모션들을 드래그앤 드랍으로 블렌드 제어창으로 넣을 수 있습니다. 여기에 필요한 각 방향별 Aim 모션을 불러옵니다.

 



 

5. 위 두가지 제어가 끝나면 다시 애니메이션 블루프린트로 가서 애님 스테이트를 만들어 준다.

(1) 기본 스테이트 머신 추가​

스테이트머신이 만들어진다.

생성 완료후 서로 이어준다.


 

 (2) New State Machine 을 더블클릭후 스테이트머신 제어창으로 들어간다.

- 그러면 비어있는 Entry라는 스테이트 연결고리가 나온다.​


(3) Entry에서 화살표방향으로 마우스를 드래그앤 드랍을 한 후 MOVE 라는 스테이트를 추가한다.


-Move에 대한 스테이트를 제작할거라 Move라고 이름지어줍니다.(이름은 자유입니다~)​



 (4) Move로 제작된 스테이트 머신을 다시 더블클릭해서 스테이트 제어창으로 들어와 위에서 제작했던 블렌드 스페이스와 에임 오프셋을 드래그앤 드랍으로 창에 올려 넣는다.

이미지 클릭하시면 원본으로 보실수 있습니다.



-여기까지 들어오면 이제 스테이트머신에서 모션 연결의 최종단계까지 왔습니다.


6. 블렌드 스페이스와 에임 오프셋에 사용된 변수값을 블루프린트에서도 선언하여 같은 구조로 움직이도록 설정한다.

  

방향, 속도, z축(Yaw),y축(pitch)에 대한 변수를 Float형으로 선언~


- 선언된 변수들을 스테이트창으로 드래그 하여 GET으로 얻어온다.


- 이제 마지막으로 아래 그림처럼 서로 연결해 주면 마무리 된다.




이동속도와 회전 의 변수값을 넣어보면서 캐릭터가 프리뷰창에서 원하는 대로 움직이는지 확인한다.


 

 

 

7. 애님 스테이트 제작이 끝났다면 이벤트 그래프로 가서 캐릭터 블루 프린트 값을 형변환으로 불러와 위치 제어 함수를 블루프린트로 제작해 준다. 

 


- 이동과 회전에 대한 블루프린트

(블루프린트의 제작 공정에 대한 자세한 코멘트는 생략합니다.)

이미지 클릭하시면 원본으로 보실수 있습니다.



- 캐릭트 블루프린트에서 움직임이 일어났을때 방향과 속도에 어떤식으로 영향을 끼칠지에 대한 함수입니다. 속도와 방향을 벡터로 변환해주고 기존에 선언했던 변수들의 값을 얻어온 값으로 SETTING해 줍니다.




- 총구 겨냥에 대한 블루프린트

(블루프린트의 제작 공정에 대한 자세한 코멘트는 생략합니다.)

이미지 클릭하시면 원본으로 보실수 있습니다.


- 캐릭트 블루프린트에서 마우스 회전이 일어났을때 총구 방향에 어떤식으로 영향을 끼칠지에 대한 함수입니다. 여기서도 방향을 벡터로 변환해주고 기존에 선언했던 변수들의 값을 얻어온 값으로 SETTING해 줍니다.

 

 

여기까지 제작후 컴파일후 에러가 없으면 완료된겁니다.

 


8. 애님블루 프린트 제작이 끝나면 캐릭터 블루 프린트에서 사용할수 있도록 디폴트 창을 열어 방금 제작한 애님 블루 프린트를 연결해 준다.

 이미지를 클릭하시면 원본으로 보실수 있습니다.


 

처음 해보시는분은 워낙 절차가 많아서 어렵고 복잡하게 느끼실수 있으실거 같네요..


블루 프린트 설정에 대해서는 언리얼 문서를 참조하시면 많은 도움 받으실거에요~

https://docs.unrealengine.com/latest/KOR/Engine/Animation/AnimBlueprints/index.html

여기까지 애니메이션 블루 프린트의 제작 방식이었습니다.

반응형
반응형

**본 가이드는 언리얼4.6에서 제작한거라 최신버전과는 다소차이가 있을수 있습니다.

 

언리얼엔진의 강력한 기능중 하나가 주인공 캐릭터 제작이 타 엔진보다 간편하다는 점입니다.

하지만, 언리얼엔진을 자주 접해 보지 않은 사람에게는 결코 쉽지 않아 보이기도 합니다.

항상 느끼지만 알기 전까진 어렵다가 알고 나면 쉬운게 언리얼엔진인거 같아요..ㅎㅎ

주인공 캐릭터 제작방식에 대해서 3개의 카테고리로 나눠 살펴보고자 합니다.

**메시 임포트 같은 기본적인 사항은 문서를 참조하도록 하고 넘어가도록 하겠습니다.

**총알 발사나 무기 장착 같은 테크닉에 대해서는 잠시 예외로 하고 추후에 다루도록 하겠습니다.


주인공 캐릭터를 만들기 위해 필요한 파일은 3가지입니다.

  

캐릭터 블루 프린트

 

애니메이션 블루 프린트

 

게임모드 블루 프린트



이 시간에는 주인공 캐릭터를 만들기 위해 가장 뼈대가 되는

캐릭터 블루 프린트 제작 방식 에 대해서 살펴 보겠습니다.



1.주인공으로 사용될 스켈레탈 메시 파일을 임포트 합니다.

기본적으로 메쉬, 피직스 에셋, 스켈레톤 세개의 파일이 생성됩니다.


스켈레탈 메시 임포트에 대한 언리얼 문서 -

https://docs.unrealengine.com/latest/KOR/Engine/Content/FBX/SkeletalMeshes/index.html


2.주인공 스켈레탈 메시를 제어할 캐릭터 블루프린트를 생성해 줍니다.

파일을 생성할 창에서 오른쪽 마우스 -> 블루프린트-> 캐릭터로 들어가 생성후 보기 편한 이름으로 지정해 줍니다.



이 예제에서는 여자주인공을 사용하기 때문에 Women_BP 라는 이름으로 설정합니다.

프리뷰에서 색깔별로 어떤 에셋인지 구분하도록 되어 있습니다.

블루프린트는 이름답게 파란색으로 되어 있네요~





 


3. 블루프린트 -> 컴포넌트 에서 사용할 메쉬와 카메라를 설정해 줍니다.


(1) 캐릭터 설정

​- 메시에 대상 캐릭터를 선택후 화살표 버튼을 눌러서 넣어줍니다.


- 메시가 바운더리 박스와 같은 위치에 있도록 위치값을 맞춰 줍니다.

- 메시가 Arrow(하늘색 화살표 방향)와 일치하도록 회전해 줍니다.



(2) 카메라 설정

컴포넌트 추가 -> 스프링 암

스프링암을 부모로 하여 하위에 카메라를 연결해 줍니다.

스피링암 추가후 카메라 추가


-  일반 카메라를 넣어도 되고 스프링 암 카메라를 넣어도 되지만, 스프링 암 컴포넌트는 부모와 자손에 일정한 거리를 유지해주며 충돌이 생기면 벽을 뚫고 나가는 것을 방지해주는 컴포넌트입니다.


- 카메라의 위치값을 설정하여 주인공을 바라보는 뷰를 정해 줍니다.



수치로 설정해 주면 되는데 실시간으로 화면을 보면서 설정하고 싶다면, 현재까지 설정한 캐릭터 블루 프린트 파일을 컴파일 후 저장한 다음 레벨(씬)에 올려 실시간으로 카메라 위치를 변경할 수 있습니다.


 

 


4. 편집 -> 프로젝트 셋팅 -> 입력으로 가서 키보드입력에 대한 설정을 해줍니다.

​- 입력에 대한 정보를 얻어 오기 위해 키보드 입력을 직접 설정할 수 있습니다.

-MoveForward의 Scale 값은 캐릭터의 움직이는 값입니다.



- 전부 만들기 힘들다면 다른 프로젝트에서 구성된 입력을 익스포트하여 임포트로 불러와서 사용해도 무방합니다.



5. 블루프린트 코딩 - 아래 그림을 참조하셔서 코딩해 줍니다.


 

전진버튼을 누르면 Action Mappings의 입력제어에 캐릭터의 새로운 벡터값을 구해 무브먼트를 설정하는 구조.


 


마우스를 회전하면 Axis Mapping의 축 변환에 따라 캐릭터의 새로운 로테이션값을 구해 무브먼트를 설정하는 구조.

 

오른쪽 마우스를 눌렀을때 화면이 변경하도록 하는 설정 - 바이오하자드 방식을 따라했습니다.



스마트폰 화면 터치 입력 - 모바일 컨트롤러 지정 

터치를 실행하기 위해서는 회전과 전진에 대한 Float형 변수를 먼저 선언해야 합니다.




 그 외에 총알 발사나 무기 변경 같은 함수도 캐릭터 블루 프린트에서 지정할수 있지만, 그 부분에 대해서는 마지막 시간에 다뤄보도록 하겠습니다.


여기까지 캐릭터 블루 프린트의 제작방식이이었습니다.

다음에는 애니메이션 블루프린트 제작에 대해서 살펴보겠습니다.  To be Continue..

 

반응형
반응형

캐스케이드는 언리얼에서 제공하는 이펙트 전용 툴입니다.

1부에서 제작한 불 쉐이더를 이용하여 이펙트를 제작했습니다.

불 이펙트에 사용된 인자는 아래와 같습니다.


사용된 인자를 순차적으로 살펴보겠습니다.

 

1. Required

사용할 메터리얼과 그 메터리얼에 대한 설정을 변경할 수 있습니다.


 

 

2. Spawn

- 이미터 파티클의 스폰개수 / 속도에 영향을 끼치는 모듈.

 

 

3. LifeTime

- 스폰시 파티클의 초기 수명을 설정하는 데 사용되는 모듈입니다.

 

 

4. Size

? 파티클 수명상의 여러 지점에서 그 크기에 영향을 끼치는 모듈입니다.

   (1) Initial Size - 파티클 수명상의 여러 지점에서 그 크기에 영향을 끼치는 모듈입니다.

 

(2) Size Scale - 파티클의 사이즈를 BaseSize에다 지정된 스케일 인수를 곱한 값으로 설정하는 모듈입니다. 주의할 점은 해당 프레임에서 이 모듈 이전의 모든 크기 조절을 덮어쓰는 모듈이라는 겁니다.

 

 

4. Parameter

- 머터리얼 같은 다른 부분을 제어할 수 있도록 파티클 시스템 외부로 데이터를 전달하는

모듈입니다.

(1) Dynamic - 모듈에 대한 동적 파라미터 배열입니다.


 

 

5. Velocity

? 다양한 방법으로 파티클의 속도를 조절하는 모듈입니다.

(1) Initial Velocity ? 파티클의 초기 속도를 설정하는 모듈입니다.

 

 

6. Location

- 파티클 수명상의 여러 시점에서 파티클의 위치에 영향을 끼치는 모듈입니다.

(1) Initial Location ? 파티클의 스폰시 초기 위치를 설정하는데 사용되는 모듈입니다.


 

(2) Cylinder - 원통형 모양 내에서 파티클의 초기 위치를 설정하는데 사용되는 모듈입니다.

 

(3) Pivot Offset - 방향성을 어떻게 할지 설정하는 모듈입니다.


 

7. SubUV

? 다수의 개별 프레임격자 배치되는 SubUV텍스처를 파티클에 활용할 수 있도록 해 주는 모듈입니다.

(1) Subimage Index ? 플로트 분포에 따라 사용할 서브이미지를 선택하는 모듈입니다. 현재 서브 이미지는 왼쪽에서 오른쪽, 위에서 아래 순입니다.

 

8. Color

- 방출된 파티클의 색에 영향을 끼칩니다.

** Color 모듈은 이미터에 사용되는 머티리얼이 Particle Color 머티리얼 표현식을 사용하여 모듈에서 머티리얼로 색을 전하도록 해야 합니다.

(1) Initial Color

-스폰시 파티클의 색을 설정하는 모듈입니다. 다른 컬러 모듈이 덮어쓰지 않는 한 파티클은 수명에 걸쳐 이 색을 유지하게 됩니다. 다음과 같은 멤버가 포함됩니다:

psys_initial_color.gif

 

(2) Color Over Life

-파티클의 수명에 걸쳐 그 색을 설정하는 모듈입니다.

psys_color_life.gif

 

 

위 그림과 같이 설정을 하면 아래 영상과 같은 불 이펙트가 출력됩니다. 

 

반응형

+ Recent posts