티스토리 뷰

반응형

큰일났다. 정말로 어렵다.

따라하고 있는 강의는 유니티 2D로 게임을 만드는 책 중의 내용이 어려워서 심화과정을 유튜브로 기록해둔 것이었다.. 따라하면 완성은 되지만 알고 하는 느낌은 아닌 것 같다. 책을 빌려 보는 것은 둘째치고 이 강의로 계속 진행하는 것이 맞을지부터 고민된다.

Gamelog 16_1. 공격 애니메이션 처리

유니티 프리팹

Prefab의 경우 사용용도에 따라 Prefab에 수정내용을 반영할지 안할지를 판단하여 Apply가 필요함.

  • 하나만 등장하는 게임 오브젝트 → 불필요
  • 여러 개 등장하는 게임 오브젝트 → 필요

하지만, Prefab의 목적 자체가 저장하여 복제하고자 함이므로, 대부분 필요할 것으로 생각된다.

 

Prefab Apply 방법

Unity Prefab apply

프리팹에 대한 수정 내용을 apply 하는 방법은 Inspector에서 Ovverrides를 클릭한 후 Apply All을 눌러 반영하면 된다.
이는 Layer를 수정하였기 때문에 Sprite Renderer에서 수정내용이 확인된다.

Edit unity script in prefab

script를 수정하거나 추가하였다면, Script로 나타나기 때문에 자신이 수정한 내용을 복구할 수도 있다.

 

Linecast로 장애물 검출

// 장애물이 있는지 Linecast로 검출.
isObstacle = Physics2D.Linecast(
    transform.position, frontPosition.position,
    1 << LayerMask.NameToLayer("Obstacle") );

사용되는 코드 중 Linecast로 장애물이 있는지 검출하는 코드에 대해 알아본다.

public static bool Linecast(Vector3 start, Vector3 end,
    int layerMask = DefaultRaycastLayers,
    QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

Linecast는 눈에 보이지 않는 광선을 쏴서 물리적인 충돌을 감지하게 된다.
start, end를 필수값으로 가지며, 이 외에 layerMaskqueryTriggerInteraction을 받을 수 있다.

  • start: 레이어 발사 시작 지점
  • end: 레이어 종료 시작 지점
  • layerMask: 감지할 레이어
  • queryTriggerInteraction: Trigger를 수행하기 위함

먼저 start값의 position은 Pig의 position값을 그대로 가져온 것이다.

set front position for character in unity

frontPosition.position의 값은 Pig의 frontPosition 오브젝트의 위치를 말한다. 가장 앞을 알기 위해 있는 오브젝트로 생각하면 될 것 같다.

1 << LayerMask.NameToLayer("Obstacle"))

layerMask는 충돌로 감지할 레이어이며, 여기서는 C#의 시프트 연산자를 사용하며, 시프트 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 정의된 비트 수만큼 이동하는 것을 말한다.
이때 시프트연산자를 사용하는 이유는 유니티에서 제공하는 다중으로 충돌레이어를 검색하는 비트마스크를 활용하기 위해서이다.

Use shift << for C# in Unity layer

LayerMask.NameToLayer("Obstacle")은 설정한 값에 의해 8이라는 값을 가지는데, 1: 0001 / 8: 1000 과 같이 설정하게 되어, "Obstacle" 레이어만 감지하도록 하는 것이다. (아무래도 책을 빌려서 자세히 봐야 할 것 같다..)

Gamelog 16_1. 공격 충돌 처리

프리팹 이동방법

Unity Move Tool

프리팹 이동시 나타나는 화살표를 당기면, 일자로 이동할 수 있다. (기록용)

 

인터페이스 활용한 Damage

인터페이스를 만들어 데미지를 적과 주캐릭터가 모두 받을 수 있게 만듦

using System;

public interface IDamageable
{
    void Damage(float damageTaken);
}

Damage는 farmer와 pig, 즉 적과 캐릭터 모두 받는 것이 필요하다. 따라서 공통된 값이므로 인터페이스를 통해 처리할 수 있다.

public class Enemy : MonoBehaviour, IDamageable과 같이 인터페이스를 상속받을 수 있으며, 이를 활용해서 damage를 처리할 수 있다.

// Pig(enemy)
IDamageable damageTarget =
                (IDamageable)findObstacle.transform.GetComponent(typeof(IDamageable));
            damageTarget.Damage(attackPower);

// ShotObj
IDamageable damageTarget = (IDamageable)other.GetComponent(typeof(IDamageable));
damageTarget.Damage(attackPower);

Unity interface

이를 활용하여, ShotObj에 Pig가 맞았을 때 HP가 닳게 되고, 0보다 작게 되면, dead상태로 변경하고, isDead 트리거를 호출하게 된다.

unity animation trigger

상태는 Current State를 통해 정지 후 확인할 수 있으며, Animator에서 파라미터 값으로 상태가 변경되는 것을 확인할 수 있다.

unity animator

아직 모르는 부분이 많아 추상적으로 이해한 내용을 기록하려고 하였음에도 내용이 잘못되었을 수 있습니다.
댓글로 말씀해주시면 정정하겠습니다.

반응형
댓글