ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 유니티 - 플레이어에게 총을 쏘는 적
    쾌락없는 책임 (공부)/Unity 2021. 1. 15. 22:56
    반응형

    소스코드

    • 총을 쏘는 오브젝트
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Enemyshooting : MonoBehaviour
    {
        public GameObject bullet;
        void Start(){
            StartCoroutine(Bullet());
        }
    
        IEnumerator Bullet(){
            Instantiate(bullet, transform.position, transform.rotation);
            yield return new WaitForSeconds(3.0f);
            StartCoroutine(Bullet());
        }
    }
    
    • 총알의 스크립트
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class EnemyBullet : MonoBehaviour
    {
        Transform playerPos;
        Vector2 dir;
        // 총알이 닿으면 없어질 레이어
        public LayerMask layer;
        void Start() {
            playerPos = GameObject.Find("Poong").GetComponent<Transform>();
            dir = playerPos.position - transform.position;
            GetComponent<Rigidbody2D>().AddForce(dir * Time.deltaTime * 10000);
        }
    
        void Update(){
            RaycastHit2D ray = Physics2D.Raycast(transform.position, transform.right, 0, layer);
            if (ray.collider != null) {
                Destroy(gameObject);
                if (ray.collider.tag == "Player") {
                    PlayerMove player = ray.collider.GetComponent<PlayerMove>();
                    player.playerDamaged(transform.position);
                }
            }
        }
    }
    

    간단 설명

    • 플레이어에게는 'Enemy'태그와 접촉하면 데미지를 입는 playerDamaged함수가 있고 이 함수는 적의 위치를 인자로 받아온다.
    • 적의 스크립트는 별거 없이 코루틴을 이용해 일정 시간마다 프리팹을 생성할 뿐이다
    • 총알 스크립트는 Transform으로 플레이어의 위치를 받아온다
      • 위 스크립트는 캐릭터명으로 되어있지만 앞으로 게임을 만든다면 플레이어블 캐릭터를 전부 같은 이름으로 정의하면 한 스크립트로 모두 처리할 수 있다.\
      • 지금의 문제는 [ dir = 플레이어 포지션 - 몬스터 포지션 ] 이라서 거리에 따라 속도가 달라진다
        • 이 부분은 dir이 양수/음수 인지에 따라 값을 일정하게 정해두면 될 것 같다.
    • 총알이 레이어에 닿으면 파괴되게 Ray를 사용했다.
      • 일반적으로 스크립트를 짜면 오브젝트가 바로 파괴되어 플레이어의 playerDamaged 함수가 발동이 안된다
      • 그래서 오브젝트를 파괴한 뒤 playerDamaged 함수를 부르게 코드를 짜야 한다
        • playerDamaged함수는 인자로 닿은 물체의 포지션을 받아와야 해서 인자로 총알의 포지션을 넘겨줬다.

    개선점

     위 설명에서 말한대로 dir 부분을 변경해야 할 필요가 있다.

               if (dir > 0 ) 어떠한 양수값 else 어떠한 음수값

     이런식으로 코드를 변경해야 될 것 같다. dir이 완전한 0이 되는 경우는 어떻게 해야하나 싶은데 dir이 완벽한 0이 되는 경우가 있을지는 모르겠다.

     

     

     또 플레이어의 bullet랑 적의 총알이 만나면 어떻게 되는가?

    반응형

    댓글

Designed by Tistory.