[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 5회차 미션 시작합니다.

무료 모델과 애니메이션을 사용하여 상태 머신을 구성하는 방법입니다.


STEP1. Mixamo - 모델링을 무료로 사용할 수 있는 사이트. (가입필요)
STEP2. Animator 구성하기 - Idle, Walk Animation을 다운로드 받아 Animator 상태 머신을 구성하고, 이를 플레이어 캐릭터와 연결하는 작업
STEP3. Animator 확장하기 - Animation State Machine Behavior를 구현하여 Animator의 구성을 확장.

 

 

 

mixamo.com

 

Mixamo

 

www.mixamo.com


+ Characters에서 'ybot' 검색하여 "Y Bot" - 다운로드 "FBX for Unity(.fbx)"를 내려받습니다.
+ Animations에서 'idle' 검색하여 아무 것이나 3개를 다운로드. Skin은 "With Skin"으로 내려받습니다. 애니메이션만 받으려는 경우에 "Without Skin"을 사용합니다.
+ Animations에서 'walk' 검색하여 마찬가지로 원하는 애니메이션 1개를 다운로드 합니다.




Unity에 Importing 하기.


Model 파일..

다운받은 파일들을 "Assets" 하위로 "FastCampus/Arts/Character/YBot/Models"에 임포팅합니다.

[Model]의 설정을 변경할 수 있지만 일단 기본으로 시작합니다.

[Rig]의 Animation Type을 "Humanoid"로 설정합니다. 사람 모양의 뼈대를 사용한다고 설정하는 것입니다. 사람 모양이 아닌 경우 "Generic"으로 설정하면 됩니다.

Skin Weights는 Vertex들이 주변 몇 개의 뼈들에 의해 영향을 받을 것인지 설정하는 것입니다. 예전에는 모바일에서 성능 향상을 위해 2개의 뼈 영향을 하기도 했지만, 요즘은 폰 성능의 향상으로 기본 4개로 설정하는 추세입니다.

[Animation] 설정은 모두 끄고, [Materials]도 기본 설정을 그대로 두겠습니다.

"Apply" 버튼 클릭하여 위에 설정한 값들을 적용합니다.

 

 

 


Animation 파일.

[Animation]에서 "Import Animation [v]"을 체크해주고 아래의 Root 옵션들은 일단 그대로 사용합니다.

ybot@idle_00, ybot@idle_01, ybot@idle_02 모두 동일하게 설정해 줍니다.





Scene에 설정하기

ybot 모델을 Hierarchy View에 가져다 놓고, 이름을 "ybot" -> "PlayerCharacter"로 설정합니다.
이 상태에서 Animator를 신규 추가해도 되고, idle_00 애니메이션을 드래그하여 "PlayerCharacter"에 가져다 놓으면 자동으로 "Animator" 컴포넌트가 생성되며 연결됩니다.

여기서 생성된 애니메이터(PlayerCharacter1)를 더블클릭하면 "Entry"에 추가된 "idle_00" 노드를 확인할 수 있습니다. 여기서 "idle_00" 노드를 더블클릭하면 위에서 설정한 애니메이션 설정값이 연동됩니다.

 

 

 



플레이를 해보면 캐릭터가 Idle 상태로 숨쉬듯이 조금씩 움직이는 모습을 볼 수 있습니다.

우리가 원하는 것은 "Idle" 상태일 때 3가지 정도로 Random하게 동작시킬 것이므로 아래와 같이 설정해 주어야 합니다.

"PlayerCharacter" - "Animator" - "Apply Root Motion [ ]"을 UnCheck합니다.

그리고 아래와 같이 Animator Node 설정에서 RMB "Create Sub-State Machine"을 선택하여 Sub-State 상태 머신을 생성합니다.

 



"New StateMachine" -> "Idle StateMachine"으로 변경하고 "Idle StateMachine"을 더블클릭하여 내부로 진입합니다.

여기서 idle_00, idle_01, idle_02 애니메이션을 드래그하여 가져다 놓습니다. idle_00은 "Base Layer"에서 설정되어 있었기에 자동으로 연결이 된 것으로 나옵니다.

이제 "Base Layer"에 있는 "idle_00"을 삭제하면 자동으로 "Entry" -> "Idle StateMachine"으로 연결됩니다.

다시 "Idle StateMachine"으로 진입해서 "idle_00" ~ "idle_02"가 랜덤하게 설정되도록 하기 위해 좌측의 "Parameters"를 설정합니다. "+"를 클릭하여 "Int"를 추가하고 변수이름은 "RandomIdle"로 지정합니다.




"idle_00" 위에서 우측클릭하여 "Make Transition"을 선택하고 "idle_01"로 연결합니다. 마찬가지로 "idle_00" -> "idle_02"로 연결해주고, "idle_01" -> "idle_00"과 "idle_02" -> "idle_00"도 추가해줍니다.

"idle_00" -> "idle_01"로 가는 화살표를 클릭하여 "Has Exit Time [ ]"을 UnCheck하고, Conditions에서 "RandomIdle", "Equals", "1"로 설정해주면 됩니다. "idle_00" -> "idle_02"로 추가해 줍니다.

 




Behavior

"Idle_00"에서 "Add Behavior"를 클릭하고, New Script에서 "IdleRandomStateMachineBehavior"로 추가합니다.




IdleRandomStateMachineBehavior.cs

변수를 추가합니다.
public int numberOfStates = 2; // 00은 기본이기에 추가된 01, 02에 대한 2개를 지정
public float minNormTime = 0f; // 최소 실행 시간
public float maxNormTime = 5f; // 최대 실행 시간
public float randomNormalTime;

readonly int hashRandomIdle = Animator.StringToHash("RandomIdle"); // string 비교의 오버헤드가 크기에 int로 hash 처리하여 비교.

override public void onStateEnter() // 기본 상태로 진입했을 때 호출됨 (idle_00 노드 진입시)
{
  randomNormalTime = Random.Range(minNormTime, maxNormTime);
}

override public void OnStateUpdate() // 상태 진입후 업데이트 될때 발생.
{
  // "Base Layer"에 있음을 의미
  if (animator.IsInTransition(0) && animator.GetCurrentAnimatorStateInfo(0).fullPathHash == stateInfo.fullPathHash)
  {
    animator.SetInteger(hashRandomIdle, -1); // 아무 것도 하지 않음.
  }
  
  if (stateInfo.normalizedTime > randomNormalTime && !animator.IsInTransition(0))
  {
    animator.SetInteger(hashRandomIdle, Random.Range(0, numberOfStates));
  }
}

Unity로 돌아와서 에러 없는지 확인후 플레이를 진행하면 Idle 상태가 넘어가는 것을 확인할 수 있습니다.




이로써 Idle 상태 Transition은 모두 완성이 되었습니다.

 




Walking Animation..

"Base Layer"에서 "Walking" 애니메이션을 드래그하여 추가합니다. Idle 상태에서 캐릭터 이동시 걸어가도록 할 것이므로 "Idle StateMachine"에서 "Make Transition"하여 "Walking" 노드로 연결해줍니다.

Idle에서 Walk 상태로의 변화를 체크하기 위해 "bool Move" 변수를 Parameter에 추가합니다.
Transition 화살표를 클릭하여 Conditions가 "Move", "true"일 때로 설정하면 됩니다.

마찬가지로 "Walk"에서 "Idle"로의 State Transition도 추가합니다.

"Ide StateMachine"의 탈출(Exit)을 설정하기 위해 아래와 같이 각 idle에서 Exit로 "Move == true" 조건을 설정해 줍니다.

 


플레이를 해보면 Idle 상태로 있다가, Move를 체크해주면 걷는 동작으로 바뀌는 것을 확인할 수 있습니다.
PlayerCharacter Script를 추가합니다.
"PlayerCharacter"의 Animator를 드래그하여 Script의 "Animator"에 연결합니다.



PlayerCharacter 스크립트를 더블클릭하여 Editor로 진입하고 필요한 변수와 함수를 작업합니다.

작업완료후 실행하면 아래와 같이 클릭하여 이동할 때 Walk State로 잘 변경되어 이동하는 것을 확인할 수 있습니다. 앞으로 공격 등의 애미메이션을 구현할 때 이와 같은 상태머신으로 작업을 하게 되는 것입니다.

 

 







3인칭 카메라 구현.



3인칭 TopDown 카메라를 구현하고 설정들을 에디터에서 확장하여 처리하는 방법입니다.

"Main Camera"에서 New Script "TopDownCamera"를 추가합니다



TopDownCamera.cs

변수추가.

public float height = 5f; //카메라 높이
public float distance = 10f; // 카메라와 타겟의 거리
public float angle = 45f; // 카메라 각도
public float lookAtHeight = 2f; // 타겟 높이
public float smoothSpeed = 0.5f; // 부드럽게 이동하기 위해 속도
private Vector3 refVelocity; // 내부 Velocity 계산용 변수
public Transform target; // 카메라의 타겟을 위한 변수

Start(), Update()는 모두 삭제하고 다음을 추가합니다.

private void LateUpdate()
{
  HandleCamera();
}

private void HandleCamera()
{
  if (!target)
  {
    return;
  }
  
  // 카메라 world position 계산
  Vector3 worldPosition = (Vector3.forward * -distance) + (Vector3.up * height);
  Debug.DrawLine(target.position, worldPosition, Color.red);
  
  Vector3 rotatedVector = Quaternion.AngleAxis(angle, Vector3.up) * worldPosition;
  Debug.DrawLine(target.position, rotatedVector, Color.green);
  
  Vector3 finalTargetPosition = target.position;
  finalTargetPosition.y += lookAtHeight;
  
  Vector3 finalPosition = finalTargetPosition + rotatedVector;
  Debug.DrawLine(target.position, finalPosition, Color.blue);
  
  transform.position = Vector3.SmoothDamp(transform.position, finalPosition, ref refVelocity, smoothSpeed);
  
  transform.LookAt(target.position); // 카메라가 타겟 바라보기
}


카메라가 바라보는 위치와 캐릭터가 바라보는 위치를 표시하여 보기위해서 디버그용 함수를 구현합니다.

OnDrawGizmos()
{
  Gizmos.color = new Color(1f, 0f, 0f, 0.5f);
  if (target)
  {
    Vector3 lookAtPosition = target.position;
    lookAtPosition.y += lookAtHeight;
    Gizmos.DrawLine(transform.position, lookAtPosition);
    Gizmos.DrawSphere(lookAtPosition, 0.25f);
  }
  
  Gizmos.DrawSphere(transform.position, 0.25f);
}

 

 


Unity로 돌아와서.. "Main Camera"의 스크립트의 Target에 "PlayCharacter"를 드래그 하여 연결해 줍니다.



그리고 플레이하면 캐릭터를 따라다니는 카메라를 구현할 수 있습니다.
변수값들을 실시간 변경해 보면서 캐릭터와 TopDown 카메라의 관계를 확인할 수 있습니다.



휴우.. 유니티는 정말 어마무시하긴 하네요.. 예전에는 코드 레벨에서 하던 작업을 UI 상에서 구성하고 연결만 하면 사용할 수 있으니 코드는 최소한으로만 작성하고 유니티툴에서 잘 활용하면 되는 것이겠습니다. 굳이 단점이라면야 소스 코드를 잘 짜는 사람이더라도 유니티툴을 잘 다룰줄 알아야 한다는 것이겠지요.. 어디에 어떤 메뉴가 있고 어떤 시점에 연결해서 써야하는지 확인해야 하는지 등을 모두 알아야 하니까요.. 눈이 뱅글뱅글 돌아갑니다. @~@


패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 4회차 미션 시작합니다.

 


Character Controller를 이용한 캐릭터 이동/점프/대시 구현

 


CharacterController를 이용한 캐릭터 구현입니다.

캐릭터콘트롤러는 물리엔진을 사용하지 않고 GameObject에 대한 움직임을 Logic으로 쉽게 처리할 수 있도록 해줍니다. 충돌 처리를 위해서 자체 Collider도 포함하고 있습니다.

Rigidbody하고의 가장 큰 차이점은 Step Offset과 Slope Limit의 설정입니다.

Step Offset은 계단과 같이 캐릭터가 올라갈 수 있는 높이를 말하고, Slope Limit은 캐릭터가 올라갈 수 있는 경사도를 설정할 수 있는 기능입니다.
물리엔진을 사용하지 않기 때문에 중력하고 이동속도 같은 계산법을 직접적으로 구현해야 합니다.



CharacterController를 이용한 Character GameObject 구성

구성 Component들:
+ Capsule Mesh - 캐릭터 UI 표시
+ CharacterController Component - 캐릭터 이동 회전 및 충돌 처리
+ ControllerCharacter.cs - 사용자 입력 및 이동 처리

 

 

기본 구성은 Rigidbody 테스트와 거의 동일하게 설정해 줍니다.
근데 Cube를 코로 생각했는데... Eye!! 눈입니다. ㅎㅎ 머 개발자 설정하기 마음이지만요. 

"GameObject"를 "ControllerCharacter"로 변경하고 진행합니다.
"ControllerCharacter"를 선택하고 가장 중요한 "Character Controller" 컴포넌트를 추가해 줍니다.
Center Y 값을 "0" -> "1"로 설정합니다. Capsule Mesh의 Position Y값도 "1'로 설정하여 Collider를 맞추어 주도록 합니다.

+ Slop Limit: 45
+ Step Offset: 0.3
+ Skin Width: 0.08 - 캐릭터 컨트롤러와 다른 Collider가 부딪혔을 때 겹칠 수 잇는 값
+ Min Move Distance: 0.001
+ Radius: 0.5
+ Height: 2

이제 스크립트를 작성해 보도록 합니다.
"Add Component"에서 "New Script"로 하여 "ControllerCharacter"를 생성합니다.
추가되었으므로 더블클릭하여 연동된 Editor가 실행되기를 기다립니다. Rigidbody 때와 마찬가지로 이동/점프/대시를 구현할 예정입니다.
기능이 거의 동일하므로 Rigidbody 때 만든 변수들을 동일하게 사용합니다. 복사->붙여넣기..
중력과 이동속도 관련된 변수는 추가됩니다.

 

 

 

 

ControllerCharacter.cs

private Rigidbody rigidbody; 를
private CharacterController characterController; 로 변경합니다.

중력을 처리하기 위한 변수를 추가합니다.
public float gravity = -9.81f;

저항값을 처리하기 위해 변수를 추가합니다.
public Vector3 drags;

// 점프, 대시, 저항력 계산용 변수
private Vector3 calcVelocity;

rightBody = GetComponent<rigitbody>(); 를
characterController = GetComponent<CharacterController>();로 변경합니다.

Update() 함수 최상단에서 사용한 CheckGroundStatus() 함수를 그대로 사용해도 되지만 CharacterController 자체에서 제공하는 isGrounded를 활용할 수 있습니다.

CheckGroundStatus(); -> isGrounded = characterController.isGrounded; 로 변경합니다.

 


땅에 도착했을 때는 중력값을 받지 않도록 코드를 수정해 줍니다.
if (isGrounded && calcVelocity.y < 0) calcVelocity.y = 0;

이동 처리를 위한 Vector3 설정 및 적용.
Vector3 move = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
characterController.Move(move * Time.deltaTime * speed);
if (move != Vector3.zero)
{
  transform.forward = inputDirection;
}

점프 코드를 수정해 줍니다.
if (Input.GetButtonDown("Jump") && isGrounded)
{
  calcVelocity.y += Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y);
}


대시도 마찬가지로 작업해 주고, 가장 중요한 중력값 계산하는 코드를 작성합니다.

 


여기까지 작업하면 스크립트에 대한 작업은 완료되었습니다.
이 상태로 실행하면 잘 동작하는 것을 확인할 수 있는데요. 대신 점프를 하면 엄청난 점프 신공을 보여줍니다. ㅋㅋㅋ Unity의 기본 중력값이 9.81이 아니기 때문입니다.
아래와 같이 설정값을 변경해 줍니다.

 

 


CharacterController와 Rigidbody는 꼭 별개로 사용되어야 하는 건 아니고 조합해서도 사용 가능합니다. 

자 이제 실행을 해보면 Rigidbody 작업 때와 같은 결과를 확인할 수 있습니다. 이동/점프/대시 모두 잘 동작합니다.

 

 

 

 

 

 



이제 NavMesh를 사용하는 캐릭터를 구현해보도록 하겠습니다.

 


NavMesh를 사용하기 위해서는 NavMeshAgent를 사용해야 합니다.
NavMeshAgent는 Unity 내부의 길찾기 시스템을 사용할 수 있게 해주고, 장애물 설정하여 캐릭터 피하기 및 길찾기 우선수위로 비용 계산도 가능하도록 해줍니다. 그리고 이 방식은 Click & Move에도 적합한 방식입니다.

 


NavMeshAgent를 이용한 Character GameObject 구성
구성 Component들:
+ Capsule Mesh - 캐릭터 추가
+ CharacterController Component - GameObject의 이동/회전 로직 및 충돌
+ NavMeshAgent - 길찾기 시스템을 이용하기 위한 Component
+ AgentControllerCharacter.cs - 사용자 입력 및 이동 처리.

 

 

Window - AI - Navigation을 추가하고, Radius / Height / Step Height / Max Slope의 값을 Capsule 캐릭터와 동일한 값으로 설정합니다.

Navigation의 [Object]를 선택하고 Scene Filter를 "Mesh Renderers"로 선택합니다.
그리고 Navigation을 적용할 GameObject들을 선택합니다.

Generate OffMeshLink는 점프라던지 순간이동 또는 다른 행동을 설정할 수 있는 것입니다.
여기서는 사용하지 않을 것이므로 Uncheck합니다.

 


그리고 컨테이너 3개에는 걸어들어갈 수 없어야 하므로, "Not Walkable"을 설정합니다.

 

 

좀더 명확한 위치 및 확인을 위해서 많긴 하지만 이미지를 많이 삽입하였습니다.

 

 

Terrain도 마찬가지로 Generate OffMeshLink를 Uncheck하고, Navigation Area를 "Walkable"로 설정합니다.


Bake - Navigation Mesh를 좀더 상세하게 설정하고 빌드할 수 있습니다.
현재는 기본으로 두고 "Bake"를 클릭하면 Navigation Mesh가 생성된 것을 확인할 수 있습니다.

 


ControllerCharacter를 선택하고 "Nav Mesh Agent" 컴포넌트를 추가합니다.
여기까지 설정은 완료되었고 스크립트 작업을 진행합니다.

Steering 값들은 내부 에이전트 Mesh가 이동할 때 사용되는 Velocity를 계산하기 위해 사용되는 값들입니다.
Obstacle Avoidance는 물체를 피해갈 때 얼마의 값들을 기준으로 피할 것인지 설정하는 것입니다.
Path Finding은 길찾기 관련된 설정을 하는 값들입니다.


기존 Controller Character를 그대로 사용하며 확장하는 형태로 만들것이므로 "Controller Character" 스크립트를 더블클릭하여 Editor를 실행합니다.



ControllerCharacter.cs

클릭 앤 무브 방식이므로 기존 변수값들중 불필요한 변수들을 제거합니다. 그리고 NavMeshAgent 및 Camera를 추가합니다.

 


void Start()
{
  characterController = GetComponent<CharacterController>();
  agent = GetComponent<NavMeshAgent>();
  agent.updatePosition = false; // Agent의 이동 시스템을 사용하지 않겠다. CharacterController의 이동 시스템으로 움직일 것이므로..
  agent.updateRotation = true; // Agent의 회전 시스템 사용.
  
  camera = Camera.main;
}

클릭 앤 무브 방식으로 처리할 것이라서 Update() 내용을 모두 제거하고 새로 작성합니다.

void Update()
{
  if (Input.GetMouseButtonDown(0))
  {
    Ray ray = camera.ScreenPointToRay(Input.mousePosition); // Make ray from screen to world

    RaycastHit hit;
    if (Physics.Raycast(ray, out hit, 100, groundLayerMask) // Peeking에 대한 체크 거리가 너무 멀면 Performance에 영향이 크기 때문에 100 정도로 설정.
    {
      Debug.Log("We hit " + hit.collider.name + " " + hit.point);
  
      agent.SetDestination(hit.point); // Agent가 알아서 이동 시작.
    }

    if (agent.remainingDistance > agent.stoppingDistance) // 가야할 거리가 남았다.
    {
      characterController.Move(agnet.velocity * Time.deltaTime);
    }
    else
    {
      characterController.Move(Vector3.zero);
    }
  }
}


Agent의 이동방향으로 캐릭터의 이동방향을 맞추어 주기 위해 LateUpdate() 함수를 구현합니다.
private void LateUpdate()
{
  transform.position = agent.nextPosition;
}

 

여기까지가 작업 완료입니다. NavAgent를 사용하기 때문에 정말 쉽게 코드가 작성되는 신비함을 느껴볼 수 있습니다.



저번에 샘플 예제가 없다고 하였는데 제가 잘못 알고 있었네요. ^^;;;
강의 자료에 해당 샘플 예제가 모두 포함되어 있었고 실행도 잘 되는 것을 확인하였습니다. ㅎㅎ
이제 앞으로의 교육 진행을 조금은 마음 편히 따라 갈 수 있을 것 같습니다.

지금까지의 내용을 실제 유니티로 실행하고 테스트 해 본 화면입니다.

 


잘 되네요~

여기까지 쉴틈 없이 따라 하고 있는데요.. 솔직히 강의 들으면 들을수록 너무 좋네요..
완전 따라가기 어렵지 않을까.. 챕터 몇개 대략 봤을 때도 불안감이 앞서있었는데요..
차근히 하나하나 듣고 따라해보니 정말 됩니다.. 기가막히게 좋네요. 
패스트캠퍼스 정말 대단합니다. 이런 좋은 강의를 착한 가격에 들을 수 있다니.. 감사할 따름이네요.

 

패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 3회차 미션 시작합니다.

 

 

이제 본격적인 유니티 게임 제작에 들어갑니다.

우왓 첫 시작이 디아블로입니다 ^^~ 자..잘.. 따라갈 수 있겠지요!?!?

 

 

우선 전체 진행 과정이 3단계로 나누어 정리되어 있습니다.

STEP 1 - 캐릭터 시스템
+ 사용자 입력
+ 캐릭터 이동
+ 애니메이션 설정
+ AI: AI는 유니티의 길찾기 및 상태머신을 구현.
+ 전투 시스템

STEP 2 - 레벨 디자인
+ 환경시스템
+ 광원 설정: 라이트 프로브, 리플렉션 프루브로 조명 기능 확장 예정..
+ 함정 이벤트 트리거
+ 퍼즐 이벤트 트리거
- 퀘스트에 따라 동적 네비게이션 처리에 대해서도 알아볼 예정.

STEP 3 - 게임 시스템 구현
+ 유지 인터페이스
+ 인벤토리 시스템
+ 상점 시스템
+ 퀘스트 시스템

 

선행 학습 요구 사항이 있습니다.
+ Unity 엔진에 대한 기본 사용 이해도
+ C#에 대한 기본 이해도
+ 게임 수학에 대한 기초 이해도

 

C#과 게임 수학은 이해하고 있지만, Unity 엔진에 대해서는 거의 초보 수준인데.. 게임 개발 교육 시작에서 기본 사용 이해도가 있어야 한다고 나옵니다 ㅠ.ㅜ; 기초 Unity 교육을 듣고 올걸 그랬나 싶지만.. 다른 기초 교육에서는 Unity 보다는 C# 등의 내용이 많다는 글을 보았었고 그래서 바로 넘어온 기억이 떠오릅니다.. 역시 열심히 따라가는 방법밖에는.. ㅋㅋ


오늘 진행 교육은 기본적인 사용자 입력과 캐릭터 이동입니다.


 

 


플레이어 캐릭터 구현하기

여러가지 방법이 있는데 각각 알아보고 RPG 게임에 맞는 캐릭터 구현을 선정하여 진행합니다.

RIGIDBODY: 게임 오브젝트를 물리엔진에서 제어하도록 하는 컴포넌트.입니다.
오브젝트에 가해진 힘에 의해서 계산됩니다. 충돌 처리를 위해 게임 클라이더 추가하여 처리할 것입니다.
+ RigidBody를 사용하는 이유: 실제 게임에서는 과장된 표현이 많아 RigidBody가 사용안되는 경우도 많지만
  일단 기본적으로 물리엔진을 경험해보고 기본적인 템플릿을 만들어 보기 위한 것입니다.
+ RigidBodyCharacter 설정하기

+ RigidBodyCharacter.cs 구현하기

 

 

 

RigidBody를 이용한 Character GameObject 구성.
1. Capsule Mesh: 캐릭터 UI 추가.
2. RigidBody Component: 물리엔진 사용.
3. Capsule Collider: 출동 연산을 위해 추가.
4. RigidBodyCharacter.cs: 사용자 입력 및 이동 처리

 

 

 


Unity
갑자기 등장한 SC_RigidBodyCharacter 프로젝트!!! 헉 어쩌어쩌지.. 미리 구성해 놓은 것이라고 하시는데...
교육 자료를 찾아봐도 없고 어떻게 배치해야할지도 모르겠습니다 ㅠ.,ㅜ; 같이 따라 만들 수 있게 맞는 자료가 있었으면 좋았겠습니다. 그래도 캐릭터 이동 구현이므로 이해하는데 지장은 없을 것 같습니다.
뒤로 가면 갈수록 어려워질텐데 더 복잡한 에셋들을 사용할 때에도 찾아보기 어려울까 걱정되긴 합니다.

Layer Ground 및 계단과 Terrain이 추가된 상태로 시작합니다. Terrain 설정은 추후 다른 강의로 설명하신답니다.


1. Hierarchy에서 "Create Empty"하여 비어있는 "GameObject"를 추가합니다.
2. Inspecter에서 해당 오브젝트에 "Capsule Collider"를 "Add Component" 해줍니다.
3. Hierarchy에서 "GameObject"의 자식으로 "3D Object - Capsule" 오브젝트를 추가하고, 부모 "GameObject"의 이름을 "RigidBodyCharacter"로 변경합니다.
4. Hierarchy에서 "Capsule"을 선택하고, Inspect에서 "Capsule Collider" 우클릭하여 "Remove Component"하여 제거합니다. Capsule 자체의 충돌을 사용하지 않을 것이기 때문입니다.
5. Inspecter에서 "RigidbodyCharacter"의 Height를 "1" -> "2"로 변경하고, Center Y를 "0" -> "1"로 변경합니다. 이것은 캐릭터의 발끝이 항상 원점이 되도록 하기 위한 것입니다.
   같은 이유로 "Capsule"의 Transform - Position - Y의 값을 "0" -> "1"로 변경합니다.
6. "RigidBodyCharacter"에 가장 중요한 "Rigidbody"를 "Add Component"하여 추가합니다.

 



Rigidbody 설정
+ Mass: 질량 설정인데 중력에는 영향을 받지 않습니다.
+ Drag: 공기저항값
+ Angular Drag: 회전을 할때의 기본값
+ Use Gravity: 중력 사용.
+ Is Kinematic: 물리엔진이 아닌 게임오브젝트 로직에 따라서 게임오브젝트를 이동할 것인가 여부.
+ Interpolate: 물리엔진에서의 애니메이션이 자연스럽게 보간할 것이지에 대한 설정.
+ Collision Detection: 충돌 처리를 연속적으로 할것인가 또는 특정한 경우에만 할 것인가 등의 설정.
+ Constraints
  '- Freeze Position [ ]X [ ]Y [ ]Z
  '- Freeze Rotation [V]X [ ]Y [V]Z - Y축 회전만 물리엔진에서 처리하고, X 및 Z축 회전은 하지 않겠다.

7. "RigidBodyCharacter"에 "Add Component" - "New Script"로 "RigidBodyCharacter" 추가합니다.
8. 이렇게 추가된 RigidBodyCharacter.cs 스크립트에서 캐릭터의 움직임을 구현해보겠습니다.

 

 

 

RigidBodyCharacter.cs

// 변수 추가.
public float speed = 5f;
public float jumpHeight = 2f;
public float dashDistance = 5f;
private Rigidbody rigidbody;
private Vector3 inputDirection = Vector3.zero;

void Start()
{
  rigidbody = GetComponent<Rigidbody>();
}

void Update()
{
  inputDirection = Vector3.zero;
  inputDirection.x = Input.GetAxis("Horizontal");
  inputDirection.z = Input.GetAxis("Vertical");
  if (inputDirection != Vector3.zero)
  {
    transform.forward = inputDirection;
  }
}

private void FixedUpdate() // 게임의 프레임과 상관없이 고정적으로 호출되는 함수.
{
  rigidbody.MovePosition(rigidbody.position + inputDirection * speed * Time.fixedDeltaTime);
}

여기까지 완성하고 실행하면, 'WASD' 키로 'Capsule' 캐릭터가 움직이는 것을 확인할 수 있습니다.

캐릭터의 진행 방향을 알수가 없기에, 'Cube' Mesh를 추가합니다.
"Cube"의 Position X0, Y0.5, Z0.5, Scale은 모두 0.25로 설정하여 캐릭터의 코(?) 처럼 배치해줍니다. ^^

실행화면입니다.

 

 

 


이제 점프, 대시 구현입니다.
키 설정은 Input Manager에서 원하는 키로 설정하면 됩니다.

점프 구현입니다.
if (Input.GetButtonDown("Jump"))
{
  Vector3 jumpVelocity = Vector3.up * Mathf.Sqrt(jumpHeight * -2f * Physics.gravity.y);
  rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);  //물리엔진에 의해 입력된 Velocity가 자동계산됩니다.
}

 


대시는 Log 함수를 사용하여 자연스럽게 정지되는 느낌을 구현합니다. 개발 상황에 맞게 변경하면 됩니다.
if (Input.GetButtonDown("Dash"))
{
  Vector3 dashVelocity = Vector3.Scale(transform.forward,
dashDistance * new Vector3((Mathf.Log(1f / (Time.deltaTime * rigidbody.drag + 1)) / - Time.deltaTime),
0,
(Mathf.Log(1f / (Time.deltaTime * rigidbody.drag + 1)) / - Time.deltaTime)));
  rigidbody.AddForce(dashVelocity, ForceMode.VelocityChange);
}

실행하면 캐릭터의 점프 및 대시가 잘 행동하는 것을 확인할 수 있습니다.
문제점이라고 한다면 공중에서 점프할 때도 계속 점프가 가능하다는 점입니다.

 

 

땅에 있을 때만 점프하도록 루틴 변경.


땅에 있는지 체크하도록 하기 위해 변수추가.
private bool isGrounded = false;
public LayerMask groundLayerMask; // 땅에 있는지 확인하기 위해 Raycast를 사용할 것인데 이것의 효율을 위해 추가.
public float groundCheckDistance = 0.3f; // 땅 검사 최소 거리.

 


void CheckGroundStatus()
{
  RaycastHit hitInfo; //충돌정보를 가져옴
#if UNITY_EDITOR //디버그 정보 표시.
  Debug.DrawLine(transform.position + (Vector3.up * 0.1f),
    transform.position + (Vector3.up * 0.1f) + (Vector3.down * groundCheckDistance));
#endif
  if (Physics.Raycast(transform.position + (Vector3.up * 0.1f), // 발끝 살짝 위쪽에서 체크
    Vector3.down, out hitInfo, groundCheckDistance, groundLayerMask))
  {
    isGrounded = true;
  }
  else
  {
    isGrounded = false;
  }
}

이제 이 함수를 Update()의 최상단에서 호출하고, 점프 루틴도 수정을 해줍니다.
void Update()
{
  CheckGroundStatus();
  
  if (Input.GetButtonDown("Jump") && isGrounded)
  { .. }
}

 


마지막으로 Unity UI상에서 "RigidbodyCharacter"의 "Ground Layer Mask"를 "Ground"로 변경합니다. 다른 바닥 지형들이 "Ground"로 설정되어 있습니다.
실행하면 Ground에서만 Jump되는 캐릭터를 볼 수 있습니다.

 

역시 게임 개발로 들어가니 빨리빨리 진행되네요..

당연하겠지만 유니티의 기본 기능만해도 설명할 것이 많기 때문에 진도가 빠르지 않을까 생각은 듭니다.

열심.. 열심히 하는 수 밖에 없겠지요 ^^???

 

그래도 패스트캠퍼스 강의는 평생 수강이 가능하니 이번이 끝이 아니라 반복적으로 해본다는 마음으로 하나씩 천천히 진행해 보아야겠습니다.

 

 

패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

 

 

[패스트캠퍼스 수강 후기] 올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 2회차 미션.


실무 개발하면서 알아두면 좋을 것들입니다.

 


+ 풀링
+ 상태머신
+ 사운드시스템
+ 유니티 에셋번들
+ 유니티 셰이더
+ 유니티 최적화
+ 프로파일링
+ 라이브팀에서의 업무와 신규개발팀의 업무 차이.




풀링 : 만들어놓은 것을 재사용하는 방법입니다.

리사용 재사용 리소스 공간.
화면에는 엄청 움직이는 것 같지만 이팩트 개수를 줄이면서 조절하여 맞춘다.
실제 게임하는 사람은 기술을 써서 다량의 몬스터가 동시에 죽을 때 100개인지 60개인지 표시되는 것이 중요하지 않습니다.
풀링 방식으로 리소스를 재활용합니다.

 

 

상태머신


플레이어의 상태를 프로그램에서 스크립트화하여 그때그때 작업하며 기획에 맞게 수정하다보면 유지보수 문제도 심각해지고 작업도 어려워지고 복잡해지고 버그도 많아진다.
그래서 상태머신을 설정합니다.
특정 이벤트에 해당하는 상태로 변경이 발생하고 해당 상태에서 또다른 이벤트에 의해 상태를 변경하는 것입니다.
단점은 아니지만 좀 복잡해질 수 있는 것은 동시의 이벤트에 대해 처리를 하려면 Attack 내의 Sub-State-Machine을 작성하고 또 하위 Sub-State 등을 추가해 나아갈 수 있는데 좀 복잡해질 수 있다.

지만 단점은 아닐 수 있는 부분이 기존 방식대로라면 if-else의 엄청 복잡한 분기 구조를 사용했어야 할텐데 오히려 어려웠을 것이기 때문입니다.

+ State은 확장성과 유지 보수가 중요합니다.
+ Transition은 절대 중복되면 안된다. Idle->Attack 또는 Idle->Jump 등 명확한 상태로 이동되어야 합니다.
+ 상태 이름은 명확해야 한다. Jump01, Jump02이런 형태면 알 수 없다.
+ Condition은 단순화가 중요.
+ Update 동작이 복잡한 State는 분리를 고민해봐야 합니다.  Sub-State를 만드는 것이지요.

 


사운드 시스템


타격감. 게임의 완성도에 영향이 컸지만 요즈음은 인디게임이나 모바일 게임에서는 중요성이 많이 낮아진 상태입니다.
왜냐면 일단 재생이 되는 것이 확인만 되면 추후 클립만 업데이트 하면 되기 때문입니다.
어차피 인기가 있어서 업데이트가 자주 발생하게 된다면 그때 피드백 받아 적용해도 될 것이기 때문입니다.

사운드 유니티툴을 제작하며 3D 입체 사운드를 처리하는 방식도 추후 개발해볼 예정입니다.
특정 위치에 도착시 Box Collision 지역을 만들어서 도착하면 자동으로 사운드를 변경하는 방법.
매번 프로그램에서 여기서 어떤 오디오 재생, 어디서는 어떤 오디오 재생하는 형태가 아니라 오디오 관리툴을 만들어서 UI 상태에서 오디오 클립을 배치하여 코드로 작업하지 않습니다.
캐릭터의 발자국 소리도 모든 상태의 소리를 신발에 넣어두는 것이 아니라 특정 위치 공간에서 오디오 클립을 모두 가지고 있고, 플레이어가 배경에 들어오는 순간 공간에 지정된 플레이어의 신발에 특정 오디오 클립을 연결하여 재생하는 형태로 만듭니다.
물이 있는 공간에 들어갔을 때 플레이어가 걸으면 철퍽철퍽하는 소리가 나는 그런 것들인 것이지요.


 


어셋번들


압축된 리소스 모음 파일이라고 생각하면 됩니다.

복잡하고 알아야 하는 내용들이 많습니다. 사용하기도 쉽지 않습니다. 그래서 어드레서블 에셋이 개발됩니다.

 


어드레서블(Addressables)은 복잡한 라이브 콘텐츠를 전달해야 하는 대규모 제작팀의 요구사항을 보다 효과적으로 지원하기 위한 Unity 에디터 및 런타임 에셋 관리 시스템입니다.
본인들도 어렵다고 인정했다고 하십니다.. ㅎㅎ 맞습니다. 이런 경우 참 많거든요.. 100% 공감이 갑니다.

에셋의 위치 지정, 빌드 및 로드와 관련하여 일반적으로 발생하는 몇 가지 문제를 해결하기 위한 프레임워크를 구축하기 위해 어드레서블이 탄생하게 되었습니다.

Meta 파일: 어셋 관련하여 Meta 파일이 엄청 중요합니다. GUID.
처음 어셋을 만드는 PC에서의 Prefab에 대한 GUID가 생성되며 들어가게 되는데 이것이 Meta 파일로 관리되게 됩니다. 그런데 Meta 파일이 공유되지 않으면 다른 PC않으면 또 독립적은 GUID가 발급되기 때문에 문제가 발생하게 됩니다.

 


유니티 셰이더

셰이더는 화면에 출력하는 픽셀의 색을 정해주는 함수라는 뜻을 가지고 있다고 합니다.
셰이더 전에 알아야 하는 내용은 파이프라인과 빛의 원리.

렌더링 파이프 라인의 4단계.
1) 3점으로 이루어진 Vertex로 구성진 오브젝트 받아오기.
2) 정점셰이더: 버텍스들에게 월드변환행렬(월드좌표계)를 곱해주므로써, 원근감 등을 표현.
3) 래스터라이져: 오브젝트를 출력해주는 과정. 3D 오브젝트가 모니터에 보이도록 픽셀이 되는데 이 과정을 래스터화라고 하며 3D 이미지가 2D 이미지가 되는 것입니다.
4) 픽셀셰이더와 프레그먼트 셰이더: 픽셀셰이더가 동작하며 조명과 텍스쳐 등 특수효과를 연산.



유니티 최적화

프로그램 최적화: 100번 돌릴걸 10번 돌려서 해결..
리소스 최적화. 100픽셀 쓸걸 10픽셀로 해결..

왜 중요하냐면

+ 유저에게 쾌적환 플레이 제공이 가능하기 때문입니다.
+ 게임 시간 절약 및 데이터 절약도 가능해집니다.
+ 우리나라 환경에서는 문제가 덜 하긴 하지만 지금도 외국에서는 데이터를 용량별로 유료로 사용하는 곳도 많습니다.
+ 플랫폼 이슈: 용량이 적거나 저사양의 모바일에서도 게임이 가능해지기 때문에 더 많은 유저가 즐길 수 있겠지요.

+ 향후 업데이트를 위해: 최적화된 패치는 용량, 시간 등 많은 이점이 있습니다.



프로파일링

현재 게임이 돌면서 하드웨어 상태를 지켜본다. 전체적인 리소스 사용 흐름량을 확인할 수 있다.
게임을 진행하는 중에 어떤 지점에서 문제가 발생하는지를 확인하기가 쉽다. 어떤 스크립트에서 문제가 발생하는지도 바로 확인이 가능하다.
특정 시점에서 CPU나 메모리 사용량이 늘어나는 구간을 그래프로 확인하여 어떤 스크립트에서 어떤 문제가 있었는지 또는 최적화를 해야하는지 등을 확인할 수 있다.



라이브팀 vs 신규개발팀


어떤 형태의 게임 개발 및 업무가 나에게 맞는 것이 중요할 것 같네요.
나에겐... 신규개발팀(?)처럼 특정 기간내의 특정 프로토타입 게임 개발을 많이 해보는 것이 많은 것들을 해볼 수 있어서 좋을 것 같네요.


추가적으로 유용한 내용들.
+ 스택오버플로우 사이트. ㅎㅎ 너무 유명하죠.. 개발일을 하면 구글 검색하며 진짜 자주 접근하게 되지요.
+ 예시 코드의 위험성. 샘플코드를 포트폴리오로 사용하지 마라.
+ 팀마다 코드 규약: 변수 규약 Camel Case 등..
+ 코드 리뷰의 중요성

+ 형상관리. GitHub, SVN

 

 

여기까지 해보았는데요.. 이건 유니티로 게임만드는 것 자체에 대한 것보다 전반적인 소프트웨어 개발자라면 알아야 하는 내용이라고 하는 것이 맞겠습니다. 정말 유용한 내용이었습니다.

 

 

패스트캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

 

예전에 패스트캠퍼스 오프라인으로 영상 처리 강의를 듣고 좋은 기억이 있어서 그 이후로는 패스트캠퍼스 강의를 지속 주시하고 있었다. 그러다 이번에 유니티 관련 업무를 진행하게 되어 겸사겸사 교육 수강을 했는데 왜인걸 환급 챌린지 과정!! 와우 ^^*~ 겸사겸사 정리할겸 기록도 남길 겸 미션 시작합니다.

 

올인원 패키지 : 유니티 포트폴리오 완성 100% 환급 챌린지 1회차 미션입니다.

 

처음 강의는 기술 면접 대비 알아두면 좋을 내용이라고 설명을 하면서 시작해 주셨습니다.

그런데 들어보니 꼭 면접은 아니더라도 전반적으로 알아두면 좋을 내용들이 많네요.

그래서 꼼꼼히 듣기 시작하였습니다.

 

 

01. 콘텐츠 프로그래머 채용 면접에 꼭 나오는 핵심 개념

우선 기술면접 보기전에 알아두면 좋을 것들에 대해 상세히 설명해주시는데요.

 


기술 면접을 준비하는 방법입니다. ㅎㅎ
열정 -> 코딩 -> 스펙 -> 경험

우선 열정! 하고자 하는 Passion이 강해야 끝까지 밀고 나갈 수 있겠지요.

 

이건 참 좋은 내용입니다. 그냥 아무 생각없이 만드는 것이 아니라 준비를 하자는 것입니다.
포트폴리오든 인디게임 출시 경험이든, 게임회사인턴 생활을 해보는 방법도 있겠지요.

저는 인턴은 어려운 나이라 ㅋㅋ 포트폴리오 및 인디게임 출시 경험을 목표로 하고 있습니다.

꼭 알아야할 가장 중요한 핵심도 설명을 해주십니다.
1. Unity란 무엇인지
2. JSON은 꼭 사용하자.
3. 다국어 처리 방법을 알자.
4. 유니티 툴. 이미 만들어진 툴은 많은 경험이 있는가? 혹은 직접 개발해서 다루어 본 툴은 있는가? 어떤 때에 적용해 보았는가?
5. 가비지 컬렉터.

 


Unity? 유니티를 아는가? 라는 질문이라기 보다는 내포된 핵심 용어 등을 잘 이해하고 있느냐는 개념입니다.
GameObject? Prefab? Component? 이러한 개념들을 어설프게 아니라 정확하게 알고 넘어가야 뼈가 되고 살이 된다는 것이지요.

 

 

JSON은 이제는 정말 중요한 개념인 것 같습니다.

사실 예전에 DataManager라는 비슷한 개념의 클래스를 어설프게 만들어 쓰면서 좋아했었는데.. ㅋㅋ 부끄럽네요. 그때 JSON을 알았더라면 바로 적용했을텐데 말이죠. ㅎㅎ
JSON은 텍스트 묶음 구조체로서 뷰어등을 통해 봐야 좀 깔끔하게 볼 수 있습니다.

텍스트 묶음의 객체화 또는 객체의 텍스트 묶음화 등이 가능합니다.

예전 서버-클라이언트 개발 방식은 서버에서 DATA(id, name, bonus) 등을 구성하고 서버에서 id, name, bonus 개별적 처리하고 클라이언트에서도 전체 문자열을 받아서 id, name, bonus를 Parsing하여 개별 할당하는 처리 방식이었는데, 문제는 개발을 해나아가면서 서버나 클라이언트에서 데이터 구조를 변경하는 경우가 자주 발생하게 되는데 그때마다 서로 맞추어 각각 변경해야 하는 경우가 다반사였습니다.

JSON을 쓰면 DATA 구조를 바로 오브젝트화 가능하기 때문에 안정적이고 빠른 개발이 가능해진다는 것이 장점입니다.

JSON과 더불어 XML도 비슷한 개념으로 같이 공부해두면 좋습니다.

JSON의 단점은 데이터의 크기가 많아지고 복잡해지면 부하가 좀 발생하게되어 느려진다는 점.

JSON 짤 쓰는 방법은
1) Serializable한 데이터 클래스.
2) Key의 이름을 잘 지어야 한다는 것.
3) 클래스 크기가 너무 길지 않게.. 또는 쪼개서.
4) 유지보수를 위해 버전 추가.

 


다국어를 다루는 크게 2가지 방법이 있는데 Text Localization과 Image Localization 입니다.

Text 로컬라이제이션은 예전에는 모든 언어를 들고 있어 무겁고 버그가 많았었는데요.
현재는 사용하는 언어만 들고 있도록 처리하여 무겁지 않도록 처리합니다.
사용중인 언어만 다운로드하고 기존 언어는 제거하는 방식인거죠.

이미지는 로컬라이제이션을 하지 않는 것이 좋습니다.
특수하게 타이틀 이미지 같은 경우가 있다면.. 그런정도만.. 특수하게.. 하지만 왠만하면 하지않아야 좋은 것이죠..



유니티 툴.. 이건 핵심이죠.. 몇십년전 단순 게임을 만들때에도 맵툴. 텍스트툴 등을 만들어서 사용했었습니다.

개발자가 직접 코드만으로 모든 처리를 한다는 것은 어렵고 힘도 부칩니다. 툴은 필수 ㅎㅎ
각종 테스트를 위한 툴이라던가.. UI를 구성하기 편하게 하기 위한 툴이라던가..
매번 빌드하여 하지 않고, 테스트하는 사람은 쉽게 여러가지 상황을 직접 확인할 수 있겠지요.

툴의 단점은.. 지속 툴 개발을 유지보수해야 하는 상황이 발생한다는 점.
실무에서는 엑셀로 때려박고 부르는 툴 형태가 되어가는 형태가 많다고 하시네요.. ㅎㅎ 그러지말자.. 고 하십니다.

Unity Tool의 UI를 구성하는 것이 편하지는 않지만 조금 번거롭지만.. 한번 UI 작성하면 많이 수정하진 않으므로 괜찮다고 합니다. 단순한 형태의 UI로 구성해서 만드는 것이 좋겠지요.



가비지 컬렉터? 쓰레기 모으기인데.. GC라고 자동으로 메모리 관리를 한다는 것입니다. 쓰레기 메모리를 알아서 삭제하며 관리하는 것이지요. 이것도 예전에는 버그도 많고 무겁고 그랬는데..
.Net 버전에 따라 GC 동작도 많이 다르고 많이 변했다고 합니다. 그래서 최신 .Net 기준으로 준비해야 합니다.

와우.. 1시간이 금방 가네요 ^^~

설명 정말 친절하게 꼼꼼하게 잘 해주십니다. ㅎㅎ

 

패스트 캠퍼스 - 올인원 패키지 : 유니티 포트폴리오 완성 bit.ly/2R561g0

 

유니티 게임 포트폴리오 완성 올인원 패키지 Online. | 패스트캠퍼스

게임 콘텐츠 프로그래머로 취업하고 싶다면, 포트폴리오 완성은 필수! '디아블로'와 '배틀그라운드' 게임을 따라 만들어 보며, 프로그래머 면접에 나오는 핵심 개념까지 모두 잡아 보세요!

www.fastcampus.co.kr

 

 

 

FastStone Image Viwer

http://www.faststone.org

* 여러 이미지 뷰어를 거쳐오다가 최종적으로 안착해서 오랫동안 사용하고 있는 프로그램입니다. 사진 보정용으로도 어느 정도 사용은 하고 있지만 아직은 이미지 뷰어의 용도로서가 최고입니다. 사진 보정용 프로그램은 별도로 정리를 해볼까 합니다.

* 라이선스: 개인 및 교육용 무료. 기업은 유료 ㅠ.ㅜ; (아직 국내 SW 단속에는 등록되지 않은 것 같음)

* 윈도우 탐색기 형태의 인터페이스라 사용이 편합니다..

* 지원 이미지 포맷

  - 열기: JPEG, BMP, GIF, PNG, TIFF, PCX, TGA, JPEG2000, PSD, EPS, WMF, CUR, ICO

  - 저장: JPEG, BMP, GIF, PNG, TIFF, PCX, TGA, JPEG2000, PDF

* 아무래도 사진 관리할때 영상이 포함되는 경우가 많은데 사진만 관리되는 프로그램에서는 불편했던 것을 해결해주네요. 동영상 재생도 지원합니다.

  - 지원 동영상: Canon CRW/CR2, Nikon NEF, Pentax PEF, Fuji RAF, Minolta MRW, Olympus ORF, Sony SRF/SR2/ARW, Panasonic RW2, Adobe DNG

* Enter를 쳐서 나오는 Full Screen에서는 슬라이드쇼 등의 기능을 볼 수 있습니다.

* 이미지 크기 조정. F3을 눌러서 일괄 이미지 변경도 가능합니다.

* 그 외에도 어마어마한 많은 기능이 있으니 사용해 보시면 만족하실 듯합니다.

 

 

Imagine

http://www.nyam.pe.kr/dev/imagine/

 

* 라이선스: 개인 및 기업 무료 

* 한참 예전에 사용하고 최근에 사용하지는 않고 있지만 기업 내 라이선스 문제로 FastStone Image Viewer 등을 쓰기가 찜찜하다 싶을 때 사용합니다.

* 개발 PC나 장비 PC에 설치두면 나쁘지 않겠지요? ㅎㅎ

* [관련 자료] Imagine 무설치입니다. (1.1.0 32비트와 64비트 유니코드 버전입니다)

Imagine_1.1.0_Unicode.zip
다운로드
Imagine_1.1.0_x64_Unicode.zip
다운로드

 

 

 

꿀뷰 HoneyView

https://www.bandisoft.com/honeyview/

 

* 라이선스: 개인, 기업 모두 무료. 

* 꿀뷰도 같이 설치해서 사용하고 있습니다... Why?

* 일단 꿀뷰는 이미지를 변경하는 기능을 제공하지 않습니다. 그래서 사진 관리 등 FastStone Image Viewer를 메인으로 사용하고 있는데요. 간단히 이미지 한 장 보거나 할 때는 꿀뷰가 편합니다 ^^; 설치 후 특정 이미지에서 마우스 우클릭을하고 키보드에서 '3'을 눌러주면 바로 꿀뷰가 나와서 이미지를 볼 수 있습니다. 만화는 태블릿으로 봐서 잘 사용하지는 않지만 꿀뷰에서는 2장 보기 지원 등 어느 정도 가려운 곳을 긁어주고 있지요..

* 그리고 작은 영역으로 전체 이미지 보기가 기본 지원이라서 다른 작업을 하며 같이 이미지를 확인해야 하는 경우 유용하게 사용할 수 있습니다.

* [관련 자료] 꿀뷰3 포터블 무설치입니다. (버전 3.0은 단일 실행 파일입니다.)

HoneyView_v3.0_Portable_Kor.zip
다운로드
Honeyview_v5.18_Portable.zip
다운로드

 

 

 

 

 

 

 

 

최신 프로그램 설치는 각각 제목 밑의 URL 링크를 클릭하여 공식 사이트에 접속하여 다운로드해서 설치하세요~~ 

 

반디집

 

* 쵝오!!! 다양한 포맷 지원. 멀티코어 지원. 암호화. 안정성 등 미사여구 필요없어요. 윈도우 설치 후 가장 먼저 설치하는 프로그램입니다.

* 라이선스: 개인 / 기업 모두 무료. 초창기부터 전도하고 다녔음 ㅎㅎ. 묻지도 따지지도 말고 무조건 사용하면 됩니다. 대한민국 대표 압축 프로그램으로 평생 유지되었으면 좋겠습니다.

 

* [무설치] 인터넷 안 되는 환경에서 가끔 필요. 유틸 패키지 USB 만들 때도 좋음.

 

BandiZip_v3.04(32bit)_Portable.zip
다운로드
BandiZip_v6.10(32bit)_Portable.zip
다운로드
BandiZip_v6.13(64bit)_Portable.zip
다운로드

 

 

 

 

빵집

 

* 개인 / 기업 라이선스 무료라서 한참을 잘 사용했던 빵집.

* 프로그래머 양병규 님이 만들어 나름 많이 유명했었던 빵집.

* 역시 먹고 살기 위해 바빠야 하는 개발자에게 지속적인 유지보수(업데이트)는 어려웠을 것이다. UTF-8 등의 문제로 파일명이 깨져보이고, 압축 폴더 명 생성/압축 문제 등 자잘한 이슈들이 오랜 시간 업데이트 되지 않아 어쩔 수 없이 7z으로 넘어가야 했으니까..

 

* 빵집! 니가 있어 행복했었다. 양병규씨 인터뷰 기사 (외부 링크)

 

 

 

알집

 

* 나름 관련 기사 및 논쟁이 많았지요. ALZ / EGG 등의 자체 포맷. 압축 및 해제 속도. 라이선스 정책. 리버싱한 프로그래머들의 질타.. 그래도 "알"이라는 귀여운 점 때문인지 좋아하는 사람들은 아직 있고.. 역시나 탄탄한 개발 회사라서 아직까지도 꾸준히 업데이트하며 지원해 나아가고 있습니다.

* 기업 유료입니다. 조금 무섭습니다. 갑자기 반디집이 없어진다고 생각해보세요!! 결국 사장되는 프로그램들을 뒤로하고 남아 있는 프로그램들이 시장을 장악할텐데.. 당장 회사에서는 비용 지출이 발생해야 합니다. 유료라서 문제라는 것은 아닙니다. 개발 회사도 먹고 살아야지요. 그래서 빵집/반디집에 감사한 것이구요. 단지 저와 같은 작은 회사로서는 걱정거리가 많아진다는 점입니다. 돈이요?? 아니요 돈만의 문제가 아닙니다. 비용지불 이후에도 단속 검열에 해당되므로 잦은 입퇴사자에 따른 관리 문제.. PC 및 노트북 관리 문제.. 그렇잖아도 할 일이 많은 와중에 자잘한 업무가 늘어난다는 것은 골치아픈 일입니다.

* 알집과 반디집 사태 (외부 링크)

 

* [관련 프로그램] Alz를 압축 해제하는 키플러(반디소프트 대표 박근홍)님이 공개한 "트집TZip"과 "UnAlz" 소스 코드입니다.

TZip_v0.61_Portable.zip
다운로드
TZip_v0.61_Source.7z
다운로드
UnAlz_v0.65_Source.tgz
다운로드

 

 

 

7-Zip

 

* 무료이면서 오픈 소스입니다. 현존하는 공개된 압축 관련 소스 코드로는 최고가 아닐까 합니다. 아직도 전 세계의 프로그래머들에 의해 업데이트 되고 있습니다.

* UI(사용자 인터페이스)가 좀 불편하다는 것이 단점이지요. 역시 보기 좋은 떡이 먹기 좋다고.. 프로그램이든 게임도 예쁘고 깔끔해야 계속 사용하고 싶어지는 것 같습니다.

 

* [관련 프로그램] 7-Zip 소스 코드 (2019.02 최신 7-Zip 19.00)

7z1900-src.7z
다운로드

* [관련 프로그램] 7zcracker. 7z으로 압축된 암호를 크랙(?) 찾아주는 7zcracker라는 소스 코드입니다. 단순 입력 방식으로 찾는 것이라 실 사용성은 떨어집니다.

7zCracker_v0.01_Portable.zip
다운로드

 

WinZip

http://www.winzip.com

WinZip.com

 
 

* 오랜 생명력과 그에 준하는 능력의 뒷받침으로 여전히 많은 사랑을 받고 있죠..

* 라이선스: 개인 무료. 기업 유료.

* [관련 프로그램] WinZIP과는 무관하지만.. 명령 프롬프트(cmd.exe)에서 사용 가능한 Zip.exe / Unzip.exe 및 소스 코드. 여러 가지 활용법은 다른 페이지를 통해 공유하려 생각중입니다.

Zip30_UnZip60.zip
다운로드

 

 

 

WinRAR

http://www.win-rar.com

Softonic website

 

 

* 라이선스: 개인과 기업 모두 유료입니다. 한 때 RAR 파일의 대명사였는데 말이죠..

 

 

 

 

기타 정보

 

* 자세한 압축 프로그램 8종 벤치마크 테스트 (외부 링크)

 

+ Recent posts