ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 충돌판정, 프리팹
    유니티/유니티 메인 2024. 1. 29. 19:12

    기본 화면

     

    1. 고양이가 키보드 버튼에 따라 왼쪽, 오른쪽으로 이동시키기 - playercontrol (player에 할당)

    public class playercontrol : MonoBehaviour
    {
        void Start()
        {
            
        }
        void Update()
        {
            if(Input.GetKeyDown(KeyCode.LeftArrow))
            {
                transform.Translate(-2, 0, 0);
                Debug.Log("왼쪽으로 이동!");
            }
            if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                transform.Translate(2, 0, 0);
                Debug.Log("오른쪽으로 이동!");
            }
        }
    }

     

    2. 화살 밑으로 떨구기 - arrowcontrol (arrow에 할당)

    public class NewBehaviourScript : MonoBehaviour
    {
        void Start()
        {
        }
        void Update()
        {
            transform.Translate(0,-0.009f,0);
    
            if(transform.position.y <-5.0)
            {
                Destroy(gameObject);
            }
        }
    }

    // 생각보다 화살이 엄청빠름

     

    3. 충돌 판정 - arrowcontrol 수정

    public class NewBehaviourScript : MonoBehaviour
    {
        GameObject player;  // 게임 오브젝트 player 선언
        void Start()
        {
            this.player = GameObject.Find("player"); // 이름이 "player"를 찾아 this.player에 넣음 
        }
        void Update()
        {
            transform.Translate(0,-0.009f,0);
    
            if(transform.position.y <-5.0)
            {
                Destroy(gameObject);
            }
            Vector2 p1 = transform.position;   // 화살의 위치
            Vector2 p2 = this.player.transform.position;  // 고양이(player)의 위치
            Vector2 dir = p1 - p2;             // 화살과 고양이 사이의 거리
            float d = dir.magnitude;           // 그 거리를 길이로 변환
            float r1 = 0.5f;                  
            float r2 = 1.0f;                   // 이 2개는 각자의 최소 충돌판정 인정 거리
    
            if(d < r1+r2)            // 만약 화살과 고양이 사이거리가 최소인정거리보다 좁아진다면
            {
                Destroy(gameObject) ;  // 화살을 없앤다
            }
        }
    }

     

    4. 화살 프리팹

    Hierachy에 있는 arrow를
    Project창으로 옮김

     

    ★중요) 오른쪽에 위치한 arrowfab이 프리팹이고 왼쪽의 arrow는 프리팹 에셋이다

     

    5. 프리팹으로 화살 공장 만들기

    public class ArrowGenerator : MonoBehaviour
    {
        public GameObject arrowprefab;
        float span = 1.0f; // 1초
        float delta = 0;
        void Update()
        {
            this.delta += Time.deltaTime;
            if(this.delta > this.span) // 1초가 되는 순간
            {
                this.span = 0;   // span을 초기화한뒤
                GameObject go = Instantiate(arrowprefab); // 화살을 새로 생성
                int r1 = Random.Range(-8, 8);     // maxexclusive이기 때문에 -8부터 7까지이다
                go.transform.position = new Vector3(r1, 7, 0); // 위치중 x좌표는 랜덤으로 생성
            }
        }
    }

    새 스크립트 arrowGenetaror 만든뒤 작성

    스크립트가 들어갈 빈공간 "GameObject" 만든뒤 스크립트 삽입
    가장 오른쪽 Arrowprefab에 프리팹으로 쓰일 오브젝트 끼우기. 중요한건 Hierachy에 arrow가 아닌 project의 원본 프리팹으로 가져와야함

     

    6. HP 게이지 만들기 (UI)

    image이름 hp게이지로 변경후 소스이미지에 미리 로드해둔 게이지 이미지 삽입. ★EventSystem 삭제하면 안됨
    Alt나 Shift 적절히 이용하여 게이지위치 조정
    HP 게이지 생성

    근데 게임화면과 캔버스 크기가 너무 차이가 나는데 조절이 안된다. 알고보니 서로의 영점이 달라서 그렇다고 한다

    게이지 선택후 Fill 설정뒤 Radial 360 설정

    7. HP 게이지 갱신하기. (충돌시 게이지 깎임)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;   //UI를 건드리기 때문에 필요
    
    public class GameDirector : MonoBehaviour
    {
        GameObject hpGuage;
        // Start is called before the first frame update
        void Start()
        {
            this.hpGuage = GameObject.Find("hpGuage");
        }
        public void DecreaseHP()
        {
            this.hpGuage.GetComponent<Image>().fillAmount -= 0.1f;  //0.1씩 게이지가 깎임
        }
    }

    GameDirector 스크립트 만든뒤 코딩

     

    빈 폴더 생성 후 GameDirector로 이름 변경

     

    public class NewBehaviourScript : MonoBehaviour
    {
        GameObject player;
        void Start()
        {
            this.player = GameObject.Find("player");
        }
        void Update()
        {
            transform.Translate(0,-0.009f,0);
    
            if(transform.position.y <-5.0)
            {
                Destroy(gameObject);
            }
            Vector2 p1 = transform.position;
            Vector2 p2 = this.player.transform.position;
            Vector2 dir = p1 - p2;
            float d = dir.magnitude;
            float r1 = 0.5f;
            float r2 = 1.0f;
    
            if(d < r1+r2)
            {
                // 감독 스크립트에 플레이어와 화살이 충돌했다고 전달
                GameObject director = GameObject.Find("GameDirector");
                director.GetComponent<GameDirector>().DecreaseHP();
                Destroy(gameObject) ;
            }
        }
    }
Designed by Tistory.