개인 과제를 마무리하고 제출했다.
마무리를 하면서 때리면 말하는 NPC를 만들었다.
때려야하니까 때릴 수 있도록 마우스 좌클릭을 하면 화살이 나가도록 해봤다.
어제 만든 Lizard NPC 코드를 보니까, 사용하지 않는 이벤트가 있는게 거슬려서, 불필요한 이벤트는 Interface에서 지우고, 메서드만 구현하도록 했다.
IConversableNPC
와 IHitableNPC
인터페이스를 구현하는 NPC_Skeleton
클래스를 만들었다.
using System;
using System.Collections.Generic;
using UnityEngine;
public class NPC_Skeleton : NPC, IHitableNPC, IConversableNPC
{
[SerializeField] SpeechBubble speechBubble;
List<string> hitedScripts = new()
{
@"!",
@"T^T",
@"Stop, {PlayerName}.",
};
public event Action<string> OnConversationEntered;
protected override void Start()
{
base.Start();
OnConversationEntered += Speech;
}
public void Speech(string script)
{
script = ScriptConverter.Convert(script);
speechBubble.Enable(script);
}
public void OnConversationEnter(string script) => OnConversationEntered?.Invoke(script);
public void OnConversationLeave(string script) { }
string RandomScriptInList(List<string> scripts)
{
return scripts[UnityEngine.Random.Range(0, scripts.Count)];
}
public void OnHit()
{
OnConversationEnter(RandomScriptInList(hitedScripts));
}
}
화살은 콜라이더에 닿으면 튕겨져나가게 구현해봤다.
private void OnCollisionEnter2D(Collision2D col)
{
if (col.contactCount > 0)
transform.up = Vector2.Reflect(transform.up, col.contacts[0].normal);
}
Vector2.Reflect
를 이용하면 현재 방향과 닿은 콜라이더의 법선 벡터로 반사각을 찾을 수 있다.
Collision2D.contacts
로 접촉 지점인 ContactPoint2D
를 받아올 수 있다.
ContactPoint2D.normal
로 접촉점의 법선 벡터를 알아낼 수 있다.
화살은 기본적으로 transform.up 방향으로 나아가도록 해줬고, 각도를 변경할 땐 변경된 각도를 transform.up으로 설정해줬다.
때리면 말하는 게 귀엽다.
new Input System
의 장점이 런타임에서의 키 리바인딩이라고 하는데, 아직 많이 안써봐서 레거시 Input
클래스에 비해 생소하고 자료형도 어지럽고 메서드들도 너무 많아서 직접 구현해보려하니깐 너무 난해했다.
그래서 유튜브로 사용자 키 리바인딩 구현하는 튜토리열 영상들을 찾아보니까, 이거 생각보다 볼륨이 큰 거 같다.
그래도 사용자 키 리바인딩은 어느 게임이던 필요한 기능이기 때문에, 다른 게임에 이식하기 쉽도록 잘 구현해두면 두고두고 쓸 일이 있을 것 같다.
그런데 다루기 너무 어려워 ..