개발/게임 교육

[Unity class] 게임 교육 18 - 각도 조종하기

이게될까 2024. 1. 6. 15:36
728x90
728x90

미션 2를 복제하여 미션 5로 만들어준다.

이미지 맞춰주고 콜라이더도 수정해준다.

이렇게 이미지들 추가!

rotate를 회전시키면서 fix와 비슷한 위치에 멈추면 성공이다!

미션 2 스크립트를 복사해 미션 5를 만들어준다.

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

public class Mission5 : MonoBehaviour
{
    public Transform rotate,handle; 
    Animator anim;
    PlayerCtrl playerCtrl_script;


    RectTransform rect_handle;

    bool isDrag,isPlay;

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

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


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

                }

            }


        }
    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
        

        isPlay = true;
    }

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

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


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

미션 2를 재활용하여 새로 작성한 코드는 거의 없다.

입 아프게 말하지만!

스크립트 작성했으면 public이나 함수 구현에 필요한 것들 다 넣어주기!

그럼 핸들이 제한된 채로 잘 움직인다.

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


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

                }

            }

            rotate.eulerAngles = new Vector3(0, 0, 90 * rect_handle.anchoredPosition.y / 195);// 최대값 기준으로 박싱한다.

        }
    }

업데이트에 rotate를 회전해주는 한 줄만 추가해주면 !

잘 움직인다!

이제 미션 성공을 만들어 보자

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

public class Mission5 : MonoBehaviour
{
    public Transform rotate,handle; 
    Animator anim;
    PlayerCtrl playerCtrl_script;

    public Color blue, red;
    RectTransform rect_handle;

    bool isDrag,isPlay;
    float rand;
    // Start is called before the first frame update
    void Start()
    {
        //getcomponent를 그냥 쓰면 안된다. 여기서 애니메이션은 하위 파일에 있다.
        anim = GetComponentInChildren<Animator>();
        rect_handle = handle.GetComponent<RectTransform>();
    }

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


                // 드래그 끝
                if (Input.GetMouseButtonUp(0))
                { // 움직임이 끝났을 때 핸들의 위치를 원위치해준다.
                    
                    // 성공 여부 체크
                    if(rect_handle.anchoredPosition.y>-5 && rect_handle.anchoredPosition.y < 5)
                    {
                        Invoke("MissionSuccess", 0.2f);
                        isPlay = true;
                    }
                    

                    isDrag = false;
                }

            }

            rotate.eulerAngles = new Vector3(0, 0, 90 * rect_handle.anchoredPosition.y / 195);// 최대값 기준으로 박싱한다.

            // 정답에 가까워 지면 색 변경
            if (rect_handle.anchoredPosition.y > -5 && rect_handle.anchoredPosition.y < 5)
            {
                rotate.GetComponent<Image>().color = blue;
            }
            else
            {
                rotate.GetComponent<Image>().color = red;

            }
        }
    }

    //미션 시작
    public void MissionStart()
    {
        anim.SetBool("IsUp", true);
        playerCtrl_script = FindObjectOfType<PlayerCtrl>();
        // 초기화
        rand = 0;


        // 랜덤 핸들 위치
        rand = Random.Range(-195, 195); // 0이 나올 수 있으므로 -10 ~ 10은 예외처리 해준다.
        while(rand >-10 && rand < 10)
        {
            rand = Random.Range(-195, 195);
        }
        rect_handle.anchoredPosition = new Vector2(184, rand);
        isPlay = true;
    }

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

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


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

근데 이렇게 만들면 그냥 핸들 한번에 쭉 올리거나 내리면 끝날거 같긴 한데 일단 이렇게 만들어 본다.

색 넣어주는거 까먹지 말기!

이렇게 잘 된다!

미션은 마우스를 놔야 끝나므로 잘 만들어 졌다.

마지막은 전선 잇기 !

728x90