개발/게임 교육

게임 교육 10 - 설정 화면

이게될까 2023. 12. 29. 18:43
728x90
728x90

설정 화면은 캐릭터 관련이므로 캐릭터의 캠버스에 이미지를 만들어 준다.

 

그리고 우린 설정 화면에서 버튼을 만들어 줘야 한다.

버튼은 여기서 추가할 수 있다.

버튼을 추가하면 자동으로 아래와 같이 택스트도 생긴다.

여기에 text를 채워준다.
설정은 이렇게 했다.

overflow를 사용하여 글자가 커져서 사라지는 것을 방지한다.

여러가지 버튼을 추가해 보았다.

여기서 글씨가 작다면 스케일을 움직이면 안된다. 스케일을 움직이면 깨지기 때문에 폰트를 통해서 조절해야 한다.

설정 버튼까지 추가해 줬다.

이로써 모든 설정 UI들이 완료되었다. 이제 기능을 구현해야 한다.

스크립트 만들기

플레이어 관련이므로 플레이어 폴더 안에 넣는다.

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

public class Settings : MonoBehaviour
{
    public bool isJoyStick;

    //설정 버튼을 누르면 호출
    public void ClickSetting()
    {
        gameObject.SetActive(true);
    }
    // 게임으로 돌아가기 버튼을 누름
    public void ClickBack()
    {
        gameObject.SetActive(false);
    }

    //터치 이동을 누르면 호출될 함수
    public void ClickTouch()
    {
        isJoyStick = false;
    }

    public void ClickJoyStick()
    {
        isJoyStick = true;
    }
}

코드는 이렇게 작성하고, isJoyStick를 가져왔으므로 PlayerCtrl파일로 가서 수정해준다,.

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

public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick;

    Animator anim;

    public float speed;
    public Settings settings_script;


    private void Start()
    {
        anim = GetComponent<Animator>();
        Camera.main.transform.parent = transform; //캐릭터 이탈 방지
        Camera.main.transform.localPosition = new Vector3(0, 0, -10);
    }
    private void Update()
    {
        Move();
    }
    
    // 캐릭터 움직임 관리
    void Move()
    {
        if (settings_script.isJoyStick)
        {
            joyStick.SetActive(true);
        }
        else
        {
            joyStick.SetActive(false);

            // 상하좌우를 터치하여 움직이기

            //클릭했는지 판단.
            if (Input.GetMouseButton(0))
            {            // 좌클릭 누르고 있는 중 컴퓨터 모바일 다 해준다.
                Vector3 dir = (Input.mousePosition - new Vector3(Screen.width * 0.5f, Screen.height * 0.5f)).normalized; // 화면 정중앙을 빼서 얼마나 이동하는지를 노말 백터화 한다.

                transform.position += dir * speed * Time.deltaTime;

                anim.SetBool("isWalk", true);// 어떤 불값을 어떻게

                //왼쪽으로 이동
                if (dir.x < 0)
                {
                    transform.localScale = new Vector3(-1, 1, 1);
                }
                else
                {
                    //오른쪽으로 이동
                    transform.localScale = new Vector3(1, 1, 1);

                }

            }
            else
            { // 이동하지 않을경우
                anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

            }
        }

    }
}

드르륵 긁어서 한번에 설정할 수 있다.

하나하나 설정해준다... (TOUCH -> CLICKTOUCH, JOYSTICK ->CLICKJOYSTICK 등등...) 

잘 돌아가는 것을 볼 수 있다.

설정 버튼을 누르면 이동하는 오류가 있긴 한데... 그리고 지금 내가 터치방식인지, 조이스틱인지 알기가 어렵다. 내 설정 방식에 색칠되는 것을 만들어 준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 이미지 사용을 할 수 있게 해준다.


public class Settings : MonoBehaviour
{
    public bool isJoyStick;
    public Image touchBtn, joyStickBtn;
    public Color blue;

    //설정 버튼을 누르면 호출
    public void ClickSetting()
    {
        gameObject.SetActive(true);
    }
    // 게임으로 돌아가기 버튼을 누름
    public void ClickBack()
    {
        gameObject.SetActive(false);
    }

    //터치 이동을 누르면 호출될 함수
    public void ClickTouch()
    {
        isJoyStick = false;
        touchBtn.color = blue;
        joyStickBtn.color = Color.white;
    }

    public void ClickJoyStick()
    {
        isJoyStick = true;
        touchBtn.color = Color.white;
        joyStickBtn.color = blue;
    }
}

Settings script를 위와 같이 설정해주고 저 색도 blue로 하면 바로 바뀌는게 아니라 다 넣어줘야 한다.

Setting의 설정이다.

그리고 시작할 때의 색도 같이 넣어준다. (터치화면 시작이므로 터치화면에 원하는 색을 넣어준다.)

B6CAFF색이다.

이제 옵션을 선택할 때 움직이는 것을 막아준다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 이미지 사용을 할 수 있게 해준다.


public class Settings : MonoBehaviour
{
    public bool isJoyStick;
    public Image touchBtn, joyStickBtn;
    public Color blue;
    public PlayerCtrl playerCtrl_script;

    //설정 버튼을 누르면 호출
    public void ClickSetting()
    {
        gameObject.SetActive(true);
        playerCtrl_script.isCantMove= true;
    }
    // 게임으로 돌아가기 버튼을 누름
    public void ClickBack()
    {
        gameObject.SetActive(false);
        playerCtrl_script.isCantMove = false;

    }

    //터치 이동을 누르면 호출될 함수
    public void ClickTouch()
    {
        isJoyStick = false;
        touchBtn.color = blue;
        joyStickBtn.color = Color.white;
    }

    public void ClickJoyStick()
    {
        isJoyStick = true;
        touchBtn.color = Color.white;
        joyStickBtn.color = blue;
    }
}

settings는 위와 같이 바꾼다. 버튼을 누르면 못 움직인다 움직인다를 명령한다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems; //UI를 선택한 것인지 그냥 움직인 것인지 확인


public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick;

    Animator anim;

    public float speed;
    public Settings settings_script;

    public bool isCantMove; // 이건 settings에서 바꾼다.

    private void Start()
    {
        anim = GetComponent<Animator>();
        Camera.main.transform.parent = transform; //캐릭터 이탈 방지
        Camera.main.transform.localPosition = new Vector3(0, 0, -10);
    }
    private void Update()
    {
        if (isCantMove)
        {
            joyStick.SetActive(false);// 못움직이는 상황에서는 조이스틱도 보이지 않는다.
        }
        else
        {
            Move();
        }
    }
    
    // 캐릭터 움직임 관리
    void Move()
    {
        if (settings_script.isJoyStick)
        {
            joyStick.SetActive(true);
        }
        else
        {
            joyStick.SetActive(false);

            // 상하좌우를 터치하여 움직이기

            //클릭했는지 판단.
            if (Input.GetMouseButton(0))
            {            // 좌클릭 누르고 있는 중 컴퓨터 모바일 다 해준다.
                if (!EventSystem.current.IsPointerOverGameObject())
                {//클릭한 것이 UI가 아니라면
                    Vector3 dir = (Input.mousePosition - new Vector3(Screen.width * 0.5f, Screen.height * 0.5f)).normalized; // 화면 정중앙을 빼서 얼마나 이동하는지를 노말 백터화 한다.

                    transform.position += dir * speed * Time.deltaTime;

                    anim.SetBool("isWalk", true);// 어떤 불값을 어떻게

                    //왼쪽으로 이동
                    if (dir.x < 0)
                    {
                        transform.localScale = new Vector3(-1, 1, 1);
                    }
                    else
                    {
                        //오른쪽으로 이동
                        transform.localScale = new Vector3(1, 1, 1);

                    }
                }
                

            }
            else
            { // 이동하지 않을경우
                anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

            }
        }

    }
}

PlayerCtrl은 위와같이 작성한다.

그리고 항상 저렇게 다른 변수를 받아올 땐 unity에서 추가해줘야 하는 것도 잊으면 안된다.

이렇게 하면 잘 된다.

 

728x90