개발/게임 교육

[Unity] 게임 교육 15 - 쓰레기 버리기 버튼 만들기

이게될까 2024. 1. 5. 00:13
728x90
728x90

핸들에서 이벤트 트리거를 추가해주자

핸들을 당겨야 한다!

그 중에 PointerDown을 추가해준다.

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

public class Mission2 : MonoBehaviour
{
    public Transform trash,handle; 
    Animator anim;
    PlayerCtrl playerCtrl_script;

    RectTransform rect_handle;

    bool isDrag;
    Vector2 originPos;

    // Start is called before the first frame update
    void Start()
    {
        //getcomponent를 그냥 쓰면 안된다. 여기서 애니메이션은 하위 파일에 있다.
        anim = GetComponentInChildren<Animator>();
        rect_handle = handle.GetComponent<RectTransform>();
        originPos = rect_handle.anchoredPosition;//핸들의 원 위치를 저장
    }

    private void Update()
    {
        // 드래그
        if (isDrag)
        { // 핸들의 위치를 이동해준다.
            handle.position = Input.mousePosition;

            // 드래그 끝
            if (Input.GetMouseButtonUp(0))
            { // 움직임이 끝났을 때 핸들의 위치를 원위치해준다.
                rect_handle.anchoredPosition = originPos;
                isDrag = false;
            }
        }
    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
        // 초기화
        for(int i = 0; i < trash.childCount; i++)
        { // 생성된 쓰레기 만큼
            Destroy(trash.GetChild(i).gameObject);

        }

        // 쓰레기 스폰
        for(int i = 0; i < 10; i++)
        {   
            // 사과
            GameObject trash4 =Instantiate(Resources.Load("Trash/Trash 4"),trash)as GameObject;
            trash4.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash4.GetComponent<RectTransform>().eulerAngles = new Vector3(0,0, Random.Range(0, 180)); // 각도 랜덤 지정

            // 캔
            GameObject trash5 = Instantiate(Resources.Load("Trash/Trash 5"), trash) as GameObject;
            trash5.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash5.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정

        }        
        for(int i = 0; i < 3; i++)
        {   
            // 병
            GameObject trash1 =Instantiate(Resources.Load("Trash/Trash 1"),trash)as GameObject;
            trash1.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash1.GetComponent<RectTransform>().eulerAngles = new Vector3(0,0, Random.Range(0, 180)); // 각도 랜덤 지정

            // 생선
            GameObject trash2 = Instantiate(Resources.Load("Trash/Trash 2"), trash) as GameObject;
            trash2.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash2.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정
            //비닐
            GameObject trash3 = Instantiate(Resources.Load("Trash/Trash 3"), trash) as GameObject;
            trash3.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash3.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정

        }
    }

    //x버튼 누르면 호출
    public void ClickCancle()
    {
        anim.SetBool("IsUp", false);
        playerCtrl_script.MissionEnd();
    }

    //손잡이 누르면 호출
    public void ClickHandle()
    {
        isDrag = true;
    }


    // 미션 성공하면 호출될 함수
    public void MissionSuccess()
    {
        ClickCancle();
    }
}

mission 2 코드 수정!

그 후 mission 2에 핸들 넣어주고, handle에서 event trigger를 아래와 같이 만들어 준다.

잘 추가해주기!

다시 말하지만 항상 게임은 끄고 수정합시다...ㅠ

이제 잘 된다!
그리고 핸들 움직임의 y축을 최대 위치 를 조정해줘야 한다

            rect_handle.anchoredPosition = new Vector2(originPos.x, Mathf.Clamp(rect_handle.anchoredPosition.y,-135,-47)); // 제한해줌!

이 한줄만 추가해주면 된다.
핸들 위치 인풋 바로 밑에 넣어주면 된다.

이제 쓰레기가 내려가는 모션을 만든다.

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

public class Mission2 : MonoBehaviour
{
    public Transform trash,handle; 
    Animator anim;
    PlayerCtrl playerCtrl_script;
    public GameObject bottom; //바닥을 꺼야 한다.


    RectTransform rect_handle;

    bool isDrag,isPlay;
    Vector2 originPos;

    // Start is called before the first frame update
    void Start()
    {
        //getcomponent를 그냥 쓰면 안된다. 여기서 애니메이션은 하위 파일에 있다.
        anim = GetComponentInChildren<Animator>();
        rect_handle = handle.GetComponent<RectTransform>();
        originPos = rect_handle.anchoredPosition;//핸들의 원 위치를 저장
    }

    private void Update()
    {
        if (isPlay)
        {
            // 드래그
            if (isDrag)
            { // 핸들의 위치를 이동해준다.
                handle.position = Input.mousePosition;
                rect_handle.anchoredPosition = new Vector2(originPos.x, Mathf.Clamp(rect_handle.anchoredPosition.y, -135, -47)); // 제한해줌!

                // 드래그 끝
                if (Input.GetMouseButtonUp(0))
                { // 움직임이 끝났을 때 핸들의 위치를 원위치해준다.
                    rect_handle.anchoredPosition = originPos;
                    isDrag = false;
                }

            }

            // 쓰레기 내려갈 조건
            if (rect_handle.anchoredPosition.y <= -130)
            {
                bottom.SetActive(false);
            }
            else
            {
                bottom.SetActive(true);
            }

            // 쓰레기가 끝까지 내려가지 않게 삭제해준다.
            for (int i = 0; i < trash.childCount; i++)
            {
                if (trash.GetChild(i).GetComponent<RectTransform>().anchoredPosition.y <= -600)
                {
                    Destroy(trash.GetChild(i).gameObject);
                }
            }

            //성공여부 체크
            if (trash.childCount == 0)
            {
                MissionSuccess();
                isPlay = false;
            }
        }
    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
        // 초기화
        for(int i = 0; i < trash.childCount; i++)
        { // 생성된 쓰레기 만큼
            Destroy(trash.GetChild(i).gameObject);

        }

        // 쓰레기 스폰
        for(int i = 0; i < 10; i++)
        {   
            // 사과
            GameObject trash4 =Instantiate(Resources.Load("Trash/Trash 4"),trash)as GameObject;
            trash4.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash4.GetComponent<RectTransform>().eulerAngles = new Vector3(0,0, Random.Range(0, 180)); // 각도 랜덤 지정

            // 캔
            GameObject trash5 = Instantiate(Resources.Load("Trash/Trash 5"), trash) as GameObject;
            trash5.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash5.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정

        }        
        for(int i = 0; i < 3; i++)
        {   
            // 병
            GameObject trash1 =Instantiate(Resources.Load("Trash/Trash 1"),trash)as GameObject;
            trash1.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash1.GetComponent<RectTransform>().eulerAngles = new Vector3(0,0, Random.Range(0, 180)); // 각도 랜덤 지정

            // 생선
            GameObject trash2 = Instantiate(Resources.Load("Trash/Trash 2"), trash) as GameObject;
            trash2.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash2.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정
            //비닐
            GameObject trash3 = Instantiate(Resources.Load("Trash/Trash 3"), trash) as GameObject;
            trash3.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash3.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정

        }
        isPlay = true;
    }

    //x버튼 누르면 호출
    public void ClickCancle()
    {
        anim.SetBool("IsUp", false);
        playerCtrl_script.MissionEnd();
    }

    //손잡이 누르면 호출
    public void ClickHandle()
    {
        isDrag = true;
    }


    // 미션 성공하면 호출될 함수
    public void MissionSuccess()
    {
        ClickCancle();
    }
}

코드는 위와 같다. isPlay를 통해 update가 과도하게 진행되는 것을 막는다.
바텀도 잘 추가해주기!

이제 잘 된다!

디테일을 잘 살려보자

Trash에 RectMask 2D를 추가해준다.

이렇게하면 쓰레기통 밖에 있는 쓰레기는 보이지 않게 된다.

이제 손잡이를 당기면 흔들리는 모션을 추가해준다.

background에서 animator를 추가해준다.

그리고 애니메이션도 Trash_Shake 이름으로 추가해준다.

이렇게 anchored Position도 추가해준다.
우측 상단의 빨간색 점을 누르면 쓰레기통을 움직여서 시간별로 다 설정해 줄 수 있다.

5초마다 움직임을 진동처럼 설정해준다.

 

살짝 느린거 같아서 속도를 3을 으로 수정해준다.

애니메이션을 추가했으면 스크립트도 수정해줘야지

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

public class Mission2 : MonoBehaviour
{
    public Transform trash,handle; 
    Animator anim;
    PlayerCtrl playerCtrl_script;
    public GameObject bottom; //바닥을 꺼야 한다.
    public Animator anim_shake;


    RectTransform rect_handle;

    bool isDrag,isPlay;
    Vector2 originPos;

    // Start is called before the first frame update
    void Start()
    {
        //getcomponent를 그냥 쓰면 안된다. 여기서 애니메이션은 하위 파일에 있다.
        anim = GetComponentInChildren<Animator>();
        rect_handle = handle.GetComponent<RectTransform>();
        originPos = rect_handle.anchoredPosition;//핸들의 원 위치를 저장
    }

    private void Update()
    {
        if (isPlay)
        {
            // 드래그
            if (isDrag)
            { // 핸들의 위치를 이동해준다.
                handle.position = Input.mousePosition;
                rect_handle.anchoredPosition = new Vector2(originPos.x, Mathf.Clamp(rect_handle.anchoredPosition.y, -135, -47)); // 제한해줌!

                anim_shake.enabled = true;

                // 드래그 끝
                if (Input.GetMouseButtonUp(0))
                { // 움직임이 끝났을 때 핸들의 위치를 원위치해준다.
                    rect_handle.anchoredPosition = originPos;
                    isDrag = false;
                    anim_shake.enabled = false;

                }

            }

            // 쓰레기 내려갈 조건
            if (rect_handle.anchoredPosition.y <= -130)
            {
                bottom.SetActive(false);
            }
            else
            {
                bottom.SetActive(true);
            }

            // 쓰레기가 끝까지 내려가지 않게 삭제해준다.
            for (int i = 0; i < trash.childCount; i++)
            {
                if (trash.GetChild(i).GetComponent<RectTransform>().anchoredPosition.y <= -600)
                {
                    Destroy(trash.GetChild(i).gameObject);
                }
            }

            //성공여부 체크
            if (trash.childCount == 0)
            {
                MissionSuccess();
                isPlay = false;
            }
        }
    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
        // 초기화
        for(int i = 0; i < trash.childCount; i++)
        { // 생성된 쓰레기 만큼
            Destroy(trash.GetChild(i).gameObject);
        }

        // 쓰레기 스폰
        for(int i = 0; i < 10; i++)
        {   
            // 사과
            GameObject trash4 =Instantiate(Resources.Load("Trash/Trash 4"),trash)as GameObject;
            trash4.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash4.GetComponent<RectTransform>().eulerAngles = new Vector3(0,0, Random.Range(0, 180)); // 각도 랜덤 지정

            // 캔
            GameObject trash5 = Instantiate(Resources.Load("Trash/Trash 5"), trash) as GameObject;
            trash5.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash5.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정

        }        
        for(int i = 0; i < 3; i++)
        {   
            // 병
            GameObject trash1 =Instantiate(Resources.Load("Trash/Trash 1"),trash)as GameObject;
            trash1.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash1.GetComponent<RectTransform>().eulerAngles = new Vector3(0,0, Random.Range(0, 180)); // 각도 랜덤 지정

            // 생선
            GameObject trash2 = Instantiate(Resources.Load("Trash/Trash 2"), trash) as GameObject;
            trash2.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash2.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정
            //비닐
            GameObject trash3 = Instantiate(Resources.Load("Trash/Trash 3"), trash) as GameObject;
            trash3.GetComponent<RectTransform>().anchoredPosition = new Vector2(Random.Range(-180, 180), Random.Range(-180, 180)); // 위치 랜덤 지정
            trash3.GetComponent<RectTransform>().eulerAngles = new Vector3(0, 0, Random.Range(0, 180)); // 각도 랜덤 지정

        }
        isPlay = true;
    }

    //x버튼 누르면 호출
    public void ClickCancle()
    {
        anim.SetBool("IsUp", false);
        playerCtrl_script.MissionEnd();
    }

    //손잡이 누르면 호출
    public void ClickHandle()
    {
        isDrag = true;
    }


    // 미션 성공하면 호출될 함수
    public void MissionSuccess()
    {
        ClickCancle();
    }
}

코드엔 애니메이션 추가!

백그라운드에서 애니메이션 꺼주기!

그리고 백그라운드도 미션 2에 넣어주기!

그럼 끝이다!

728x90