유니티 기초

챕터5 고양이탈출 - Prefab

다모아 2023. 8. 2. 14:39

화면가두기

https://ruen346.tistory.com/124

 

유니티(Unity) 캐릭터 범위내 이동 - Mathf.Clamp

유니티에서 캐릭터를 Translate를 이용하여 움직이게 될때 특정 범위안에서만 이동하고 싶을때가 있다. 이럴때에는 Mathf.Clamp 함수를 사용하면 된다. character.transform.Translate(Time.deltaTime, 0, 0); 기존에

ruen346.tistory.com

 

GameDirector

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class GameDirector : MonoBehaviour
{
    private GameObject catGo;
    private GameObject hpGaugeGo;
    private GameObject txtGameOverGo;
    // Start is called before the first frame update
    void Start()
    {
        this.catGo = GameObject.Find("cat");
        this.hpGaugeGo = GameObject.Find("hpGauge");
        this.txtGameOverGo = GameObject.Find("txtGameOver");
        Debug.LogFormat("{0}, {1}", this.catGo, this.hpGaugeGo);

    }

    public void DecreaseHp()
    {
        Image hpGauge = this.hpGaugeGo.GetComponent<Image>();
        hpGauge.fillAmount -= 0.1f;

        if (hpGauge.fillAmount == 0f)
        {
            Text text = txtGameOverGo.GetComponent<Text>();
            text.text = string.Format("GameOver");
        }
    }
}

 

ArrowGenerator

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrowGenerator : MonoBehaviour
{
    public GameObject arrowPrefab; //프리팹 원본 파일
    private float elapsedTime; //경과 시간

    public void Awake()
    {
        
    }
    // Start is called before the first frame update
    void Start()
    {
        
    }

    // Update is called once per frame
    void Update()
    {
        //Time.deltaTime 어딘가에다가 누적 : 흘러간 시간, 매 프레임마다 Time.deltaTime을 경과시간에 더해준다
        this.elapsedTime += Time.deltaTime;

        //경과시간이 1초를 지나갔다면
        if(this.elapsedTime > 1f)
        {
            //화살을 만든다.
            this.CreateArrow();
            //경과시간 초기화
            this.elapsedTime = 0;
        }
    }
    private void CreateArrow()
    {
        //arrowGo  : 프리팹 인스턴스 혹은 복제본
        GameObject arrowGo = Instantiate(this.arrowPrefab);

        // max - 1 해줘야함 원래는 -7 , 7
        //Random.Range(-7, 8);
        //// float는 딱 맞는 값
        //Random.Range(-7.5f, -7.5f);
        arrowGo.transform.position = new Vector3(Random.Range(-7, 8), 6f, 0);
    }
}

 

ArrowController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor.UI;
using UnityEngine.UI;
using UnityEngine.SocialPlatforms.Impl;

public class ArrowController : MonoBehaviour
{
    public float radius = 1;

    [SerializeField] //SerializeField 애트리뷰트를 사용하면 private 멤버도 인스펙터에 노출
                     //,, 다른 점 -> 인스턴스에 접근 불가 ,, 혼선 막기
    private float speed;
    private GameObject catGo;
    private GameObject gameDirectorGo;

    // Start is called before the first frame update
    void Start()
    {
        this.catGo = GameObject.Find("cat");
        Debug.Log("catGo : {0}", catGo);
    }

    private bool IsCollide()
    {
        //두 원사이의 거리
        //e - s = length
        //var c = this.transform.position - this.catGo.transform.position;
        Vector3 p1 = this.transform.position; //화살의 중점
        Vector3 p2 = this.catGo.transform.position; //고양이의 중점
        Vector3 dir = p1 - p2; //물리 벡터 (크기와 방향)
        float distance = dir.magnitude;
        //Debug.Log(distance);

        var dis = Vector3.Distance(this.transform.position, this.catGo.transform.position);
        Debug.LogFormat("{0} ", dis);

        //반지름의 합
        CatController catController = this.catGo.GetComponent<CatController>();
        var sumRadius = this.radius + catController.radius;
        Debug.LogFormat("두 원의 반지름의 합 : {0}", sumRadius);

        //두 원사이의 거리가 두 원의 반지름의 합보다 크면 false (부딪히지 않았다)

        return dis < sumRadius;
    }

    // Update is called once per frame
    void Update()
    {
        //Time.deltaTime : 이전 프레임과 현재 프레임 사이의 간격 시간
        //Debug.Log(Time.deltaTime);

        //프레임 기반
        //this.gameObject.transform.Translate(0, -1, 0);

        //시간 기반 이동
        //속도 * 방향 * 시간
        //1f * new Vector3(0, -1, 0) * Time.deltaTime
        //this.gameObject.transform.Translate(this.speed * Vector3.down * Time.deltaTime);
        this.transform.Translate(this.speed * Vector3.down * Time.deltaTime);

        if (this.transform.position.y <= -4.559f)
        {
            GameObject gameDirectorGo = GameObject.Find("GameDirector");
            GameDirector gameDirctor = gameDirectorGo.GetComponent<GameDirector>();
            gameDirctor.IncreaseScore();
            Destroy(this.gameObject);
        }

        if (this.IsCollide())
        {
            Debug.LogFormat("충돌했다.");

            GameObject gameDirectorGo = GameObject.Find("GameDirector");
            GameDirector gameDirector = gameDirectorGo.GetComponent<GameDirector>();
            gameDirector.DecreaseHp();
            Destroy(this.gameObject); //ArrowController컴포넌트가 붙어있는 게임오브젝트를 씬에서 제거한다.
        }
        else
        {
            Debug.LogFormat("충돌하지 않았다.");
        }
    }

    //이벤트 함수
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(this.transform.position, this.radius);
    }
}

 

CatController

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CatController : MonoBehaviour
{
    public float radius = 1;
    private GameObject hpGaugeGo;
    // Start is called before the first frame update
    void Start()
    {
        this.hpGaugeGo = GameObject.Find("hpGauge");
    }

    // Update is called once per frame
    void Update()
    {
        Image hpGauge = this.hpGaugeGo.GetComponent<Image>();

        if (hpGauge.fillAmount > 0)
        {
            //키 입력 받기
            if (Input.GetKeyDown(KeyCode.LeftArrow))
            {
                //왼쪽 화살표를 눌렀다면
                this.MoveLeft();
                //화면에 가두기
                this.transform.position = new Vector3(Mathf.Clamp(this.transform.position.x, -8.0F, 8.0F), -4, 0);
            }
            else if (Input.GetKeyDown(KeyCode.RightArrow))
            {
                //오른쪽 화살표를 눌렀다면
                this.MoveRight();
                //화면에 가두기
                this.transform.position = new Vector3(Mathf.Clamp(this.transform.position.x, -8.0F, 8.0F), -4, 0);
            }
        }
        else
        {
            return;
        }

        
    }


    //이벤트 함수
    private void OnDrawGizmos()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(this.transform.position, this.radius);
    }

    public void MoveLeft()
    {
        this.transform.Translate(-1, 0, 0);
    }

    public void MoveRight()
    {
        this.transform.Translate(1, 0, 0);
    }
}

'유니티 기초' 카테고리의 다른 글

pixel_sword  (0) 2023.08.03
챕터6 고양이 점프[점프막기, 카메라 아래 최소치 정하기 미완]  (0) 2023.08.02
챕터5 고양이탈출  (0) 2023.08.01
자동차 스와이프 SwipeCar  (0) 2023.08.01
유니티  (0) 2023.07.31