안녕하세요 유니티 비기너입니다.
이번 시간에는 아군 또는 적이 피해를 입히거나 입혔을 때
나타나는 Damage Text를 만들어보겠습니다.
결과 화면
1. Sprite 준비
위와 같이 3가지 Sprite를 준비했습니다.
2. 오브젝트들을 생성합니다.
Background : 배경 (없어도 무관합니다)
Canvas : UI Text는 반드시 Canvas 아래에 생성되어야 합니다
Player : 키 입력을 받고 총알을 발사할 오브젝트
Enemy : 총알을 받아내는 오브젝트 (tag를 Enemy로 변경)
Bullet : 총알 오브젝트, Animator가 포함되어있습니다.
DamageText : Damage를 표시할 오브젝트,
Scale값을 제어하여 생성 지점에서 점차 상승하여 사라지는 느낌을 주었으며
Animation 재생 끝 지점에 Destroy 이벤트를 추가하여
재생이 끝나는 시기쯤 오브젝트를 파괴시킵니다.
Bullet, DamageText는 프로젝트로 드래그하여 Prefab을 만듭니다.
2개의 Prefab은 스크립트를 활용하여 특정 조건에 의해 생성됩니다.
3. 스크립트 작성
※스크립트들은 오브젝트와 동일한 이름에 할당하시면 됩니다.
Player 스크립트
public class PlayerManager : MonoBehaviour
{
public GameObject bullet;
private void Update() {
if(Input.GetKeyDown(KeyCode.Space)) {
Shoot();
}
}
public void Shoot() {
GameObject bulletObject = Instantiate(bullet, transform.position, Quaternion.identity);
}
}
Player스크립트는 Space입력을 받으면 Bullet오브젝트를 생성합니다.
Bullet 스크립트
public class Bullet : MonoBehaviour {
public Rigidbody2D rb;
public int bulletDamage;
public float bulletSpeed;
private void Awake() {
bulletSpeed = 10;
bulletDamage = Random.Range(1, 11);
}
private void Update() {
rb.AddForce(Vector2.up * bulletSpeed);
}
public void OnTriggerEnter2D(Collider2D col) {
if (col.tag == "Enemy") {
Vector3 pos = Camera.main.WorldToScreenPoint(col.transform.position);
DamageTextController.Instance.CreateDamageText(pos, bulletDamage);
Destroy(this.gameObject);
} else if (col.tag == "Wall") {
Destroy(this.gameObject);
}
}
}
플레이어에 의해서 생성된 Bullet오브젝트는 Rigidbody Addforce를 활용하여
Vector.up방향으로 힘을 가하여 이동하며, Enemy tag를 가진 물체와 충돌 시
DamageTextController를 호출하여 DamageText오브젝트를 생성합니다.
DamageTextController 스크립트
public class DamageTextController : MonoBehaviour
{
private static DamageTextController _instance = null;
public static DamageTextController Instance {
get {
if(_instance == null) {
_instance = GameObject.FindObjectOfType<DamageTextController>();
if (_instance == null) {
Debug.LogError("There's no active DamageTextController Object");
}
}
return _instance;
}
}
public Canvas canvas;
public GameObject dmgTxt;
public void CreateDamageText(Vector3 hitPoint, int hitDamage) {
GameObject damageText = Instantiate(dmgTxt, hitPoint, Quaternion.identity, canvas.transform);
damageText.GetComponent<Text>().text = hitDamage.ToString();
}
}
DamageText 프리 팹을 할당시켜놓고 호출에 의해 생성합니다.
DamageText 스크립트
public class DamageText : MonoBehaviour
{
private void Update() {
transform.position += Vector3.up;
}
public void DestoryEvent() {
Destroy(gameObject);
}
}
Enemy와 Bullet이 충돌하면 생성되며 position을 up 방향으로 변경시키면서
Aniamtion의 동작이 끝나는 지점에 Event가 발생하여 파괴됩니다.
위의 내용을 간단하게 표현하면
1. Text 오브젝트를 Prefab으로 만들고
2. 특정 조건에 의해서 Text 생성하면 됩니다.
다양한 방식에 응용하셔서 사용하셨으면 좋겠습니다.
지금까지 읽어주셔서 감사합니다.
'유니티실습' 카테고리의 다른 글
유니티 스마트폰 기울기로 캐릭터 이동하기 (0) | 2020.07.13 |
---|---|
유니티 2D 모델링 리깅 애니메이션 만들기 기초편 (0) | 2020.07.12 |
유니티 코루틴을 활용한 Fade In Fade Out (0) | 2020.07.09 |
유니티 DontDestroyOnLoad 씬 반복 전환 시 활용법 (1) | 2020.07.08 |
유니티 카메라 culling Mask사용해보기 (0) | 2020.07.07 |