티스토리 뷰
따라하고 있는 강의는 유니티 2D로 게임을 만드는 책 중의 내용이 어려워서 심화과정을 유튜브로 기록해둔 것이었다.. 따라하면 완성은 되지만 알고 하는 느낌은 아닌 것 같다. 책을 빌려 보는 것은 둘째치고 이 강의로 계속 진행하는 것이 맞을지부터 고민된다.
Gamelog 16_1. 공격 애니메이션 처리
Prefab의 경우 사용용도에 따라 Prefab에 수정내용을 반영할지 안할지를 판단하여 Apply
가 필요함.
- 하나만 등장하는 게임 오브젝트 → 불필요
- 여러 개 등장하는 게임 오브젝트 → 필요
하지만, Prefab의 목적 자체가 저장하여 복제하고자 함이므로, 대부분 필요할 것으로 생각된다.
Prefab Apply 방법
프리팹에 대한 수정 내용을 apply 하는 방법은 Inspector
에서 Ovverrides
를 클릭한 후 Apply All
을 눌러 반영하면 된다.
이는 Layer를 수정하였기 때문에 Sprite Renderer
에서 수정내용이 확인된다.
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를 필수값으로 가지며, 이 외에 layerMask
와 queryTriggerInteraction
을 받을 수 있다.
- start: 레이어 발사 시작 지점
- end: 레이어 종료 시작 지점
- layerMask: 감지할 레이어
- queryTriggerInteraction: Trigger를 수행하기 위함
먼저 start값의 position은 Pig의 position값을 그대로 가져온 것이다.
frontPosition.position의 값은 Pig의 frontPosition 오브젝트의 위치를 말한다. 가장 앞을 알기 위해 있는 오브젝트로 생각하면 될 것 같다.
1 << LayerMask.NameToLayer("Obstacle"))
layerMask는 충돌로 감지할 레이어이며, 여기서는 C#의 시프트 연산자를 사용하며, 시프트 연산자는 왼쪽의 피연산자를 오른쪽 피연산자로 정의된 비트 수만큼 이동하는 것을 말한다.
이때 시프트연산자를 사용하는 이유는 유니티에서 제공하는 다중으로 충돌레이어를 검색하는 비트마스크를 활용하기 위해서이다.
LayerMask.NameToLayer("Obstacle")
은 설정한 값에 의해 8이라는 값을 가지는데, 1: 0001 / 8: 1000 과 같이 설정하게 되어, "Obstacle" 레이어만 감지하도록 하는 것이다. (아무래도 책을 빌려서 자세히 봐야 할 것 같다..)
Gamelog 16_1. 공격 충돌 처리
프리팹 이동방법
프리팹 이동시 나타나는 화살표를 당기면, 일자로 이동할 수 있다. (기록용)
인터페이스 활용한 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);
이를 활용하여, ShotObj
에 Pig가 맞았을 때 HP가 닳게 되고, 0보다 작게 되면, dead
상태로 변경하고, isDead
트리거를 호출하게 된다.
상태는 Current State
를 통해 정지 후 확인할 수 있으며, Animator에서 파라미터 값으로 상태가 변경되는 것을 확인할 수 있다.
아직 모르는 부분이 많아 추상적으로 이해한 내용을 기록하려고 하였음에도 내용이 잘못되었을 수 있습니다.
댓글로 말씀해주시면 정정하겠습니다.
'프로그래밍 > Unity' 카테고리의 다른 글
Gamelog 18. 총알피하기 게임 만들기(2) (2) | 2023.03.22 |
---|---|
Gamelog 17. 총알피하기 게임 만들기(1) (0) | 2023.03.21 |
Gamelog 15. 무언가 어렵다 (0) | 2023.03.02 |
Gamelog 14. 강의를 따라한다 (0) | 2023.02.20 |
Gamelog 13. 점수를 얻었다 (0) | 2023.02.15 |