개발/게임 교육

[Unity class] 게임 교육 22 - 킬 퀘스트 준비

이게될까 2024. 1. 6. 23:50
728x90
728x90

미션이랑 비슷하므로 미션을 복제해서 kill로 바꿔준다.

그리고 미션들을 다 지워준다.

이렇게 되면 준비 완료!

이제 메인 화면에서 버튼 누르면 넘어가는거 만들기!

스크립트를 좀 바꿨다. missionview를 playview로 바꿔서 시점을 통일 시켜줬는데 코드는 아래 나열하겠다.
클래스로 무슨 스크립트인지 확인 가능하다.

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

public class MainMenu : MonoBehaviour
{
    public GameObject missionView,killView;
    // 게임 종료 버튼 누르면 호출
    public void ClickQuit()
    {
        // 유니티 에디터
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false; 

        // 안드로이드
#else
        Application.Quit();
#endif

    }
    // 미션 버튼 누르면 호출
    public void ClickMission()
    {
        gameObject.SetActive(false);
        missionView.SetActive(true);
        //캐릭터가 메인 화면에서 보이는 것 때문에 캐릭터를 지운 뒤 여기서 읽어 온다.
        GameObject player = Instantiate(Resources.Load("Character"), new Vector3(0,-2,0),Quaternion.identity)as GameObject;
        // PlayerCtrl 스크립트를 가져와서 메인 뷰에 게임 오브젝트를 넣는다.
        player.GetComponent<PlayerCtrl>().mainView = gameObject;
        player.GetComponent<PlayerCtrl>().playView = missionView;

        missionView.SendMessage("MissionReset");
    }    
    // 킬 버튼 누르면 호출
    public void ClickKill()
    {
        gameObject.SetActive(false);
        killView.SetActive(true);
        //캐릭터가 메인 화면에서 보이는 것 때문에 캐릭터를 지운 뒤 여기서 읽어 온다.
        GameObject player = Instantiate(Resources.Load("Character"), new Vector3(0,-2,0),Quaternion.identity)as GameObject;
        // PlayerCtrl 스크립트를 가져와서 메인 뷰에 게임 오브젝트를 넣는다.
        player.GetComponent<PlayerCtrl>().mainView = gameObject;
        player.GetComponent<PlayerCtrl>().playView = killView;

        missionView.SendMessage("KillReset");
    }
}

 

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


public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick, mainView, playView;
    public Button btn;
    Animator anim;
    GameObject coll;

    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);// 어떤 불값을 어떻게

            }
        }

    }

    // 캐릭터 삭제
    public void DestroyPlayer()
    {
        Camera.main.transform.parent = null;
        Destroy(gameObject);
    }

    //트리거와 접촉한 경우
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Mission")
        {
            coll = collision.gameObject;
            btn.interactable = true; 
        }
    }

    //트리거와 떨어진경우
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Mission")
        {
            coll = null;

            btn.interactable = false;
        }
    }

    //버튼 누르면 호출
    public void ClickButton()
    {
        //미션 스타트를 호출
        // 미션 스타트 스크립트를 받아와야 하는데 간단하게 호출 가능
        coll.SendMessage("MissionStart");
        isCantMove = true;
        btn.interactable = false;


    }

    //미션 종료하면 호출
    // mission1파일에서 호출
    public void MissionEnd()
    {
        isCantMove = false;
    }
}

 

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

// 1. 스틱 드래그 + 제한 값 (스틱에 이벤트 트리거를 만들어줘야 한다.)
// 2. 드래그한 만큼 캐릭터를 이동

public class JoyStick : MonoBehaviour
{
    public RectTransform stick, backGround; // 큰원의 반지름을 받아온다.
    PlayerCtrl playerCtrl_script;
    bool isDrag;
    float limit;
    Animator anim;


    public void Start()
    {
        anim = GetComponent<Animator>();

        playerCtrl_script = GetComponent<PlayerCtrl>();
        limit = backGround.rect.width * 0.5f;
    }
    public void Update()
    {
        // 드래그 하는 동안
        if (isDrag)
        {// 스틱의 위치를 마우스로 가져간다.
            //stick.position = Input.mousePosition;
            Vector2 vec = Input.mousePosition - backGround.position; // 큰 동그라미 기준으로 계산한다.
            stick.localPosition = Vector2.ClampMagnitude(vec, limit);

            Vector3 dir = (stick.position - backGround.position).normalized;
            transform.position += dir * playerCtrl_script.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);

            }
            // 드래그 끝나면
            if (Input.GetMouseButtonUp(0))
            {// 터치가 끝났을 때
                stick.localPosition = new Vector3(0, 0, 0);
                //로컬 포지션은 부모(조이스틱)으로 부터의 위치

                isDrag = false;
            }
        }
        else
        {
            anim.SetBool("isWalk", false);// 어떤 불값을 어떻게

        }
    }
    //스틱을 누르면 호출 될 함수
    public void ClickStick()
    {
        isDrag = true;
    }

}

이제 KillCtrl script를 만들고 작성해보자!

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

public class KillCtrl : MonoBehaviour
{
    // 초기화
    public void KillReset()
    {

    }

}

메인 메뉴에서 부르는 킬 리셋만 간단하게 만들어 줬고, 이제 NPC를 만들러 가보자

이렇게 들어가서 NPC를 만들어 준다.

NPC의 설정은 이렇다

콜라이드는 감지를 위한 것이므로 트리거 체크도 해주고, TAG도 추가해준다.

Kill을 메인 메뉴와 연결!
메인 메뉴를 kill과 연결!

실행하면 잘 된다!

다른 캐릭터가 보인다!

근데 버튼이 use 버튼이다. 이걸 kill 버튼으로 바꿔주자!

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


public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick, mainView, playView;
    public Button btn;
    Animator anim;
    GameObject coll;
    public Sprite use, kill;


    public float speed;
    public Settings settings_script;

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

    private void Start()
    {
        anim = GetComponent<Animator>();
        Camera.main.transform.parent = transform; //캐릭터 이탈 방지
        Camera.main.transform.localPosition = new Vector3(0, 0, -10);

        if (isMission)
        {// 미션
            btn.GetComponent<Image>().sprite = use;
        }
        else
        {// 킬퀘스트
            btn.GetComponent<Image>().sprite = kill;

        }
    }
    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);// 어떤 불값을 어떻게

            }
        }

    }

    // 캐릭터 삭제
    public void DestroyPlayer()
    {
        Camera.main.transform.parent = null;
        Destroy(gameObject);
    }

    //트리거와 접촉한 경우
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Mission")
        {
            coll = collision.gameObject;
            btn.interactable = true; 
        }
    }

    //트리거와 떨어진경우
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Mission")
        {
            coll = null;

            btn.interactable = false;
        }
    }

    //버튼 누르면 호출
    public void ClickButton()
    {
        //미션 스타트를 호출
        // 미션 스타트 스크립트를 받아와야 하는데 간단하게 호출 가능
        coll.SendMessage("MissionStart");
        isCantMove = true;
        btn.interactable = false;


    }

    //미션 종료하면 호출
    // mission1파일에서 호출
    public void MissionEnd()
    {
        isCantMove = false;
    }
}

이제 버튼을 나눠줬으니 is Mission을 어디서 활성화 시킬까?

메인메뉴!

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

public class MainMenu : MonoBehaviour
{
    public GameObject missionView,killView;
    // 게임 종료 버튼 누르면 호출
    public void ClickQuit()
    {
        // 유니티 에디터
#if UNITY_EDITOR
        UnityEditor.EditorApplication.isPlaying = false; 

        // 안드로이드
#else
        Application.Quit();
#endif

    }
    // 미션 버튼 누르면 호출
    public void ClickMission()
    {
        gameObject.SetActive(false);
        missionView.SetActive(true);
        //캐릭터가 메인 화면에서 보이는 것 때문에 캐릭터를 지운 뒤 여기서 읽어 온다.
        GameObject player = Instantiate(Resources.Load("Character"), new Vector3(0,-2,0),Quaternion.identity)as GameObject;
        // PlayerCtrl 스크립트를 가져와서 메인 뷰에 게임 오브젝트를 넣는다.
        player.GetComponent<PlayerCtrl>().mainView = gameObject;
        player.GetComponent<PlayerCtrl>().playView = missionView;
        player.GetComponent<PlayerCtrl>().isMission = true;

        missionView.SendMessage("MissionReset");
    }    
    // 킬 버튼 누르면 호출
    public void ClickKill()
    {
        gameObject.SetActive(false);
        killView.SetActive(true);
        //캐릭터가 메인 화면에서 보이는 것 때문에 캐릭터를 지운 뒤 여기서 읽어 온다.
        GameObject player = Instantiate(Resources.Load("Character"), new Vector3(0,-2,0),Quaternion.identity)as GameObject;
        // PlayerCtrl 스크립트를 가져와서 메인 뷰에 게임 오브젝트를 넣는다.
        player.GetComponent<PlayerCtrl>().mainView = gameObject;
        player.GetComponent<PlayerCtrl>().playView = killView;
        player.GetComponent<PlayerCtrl>().isMission = false;

        missionView.SendMessage("KillReset");
    }
}

한줄이면 뚝딱!

이제 NPC와의 충돌 체크!

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


public class PlayerCtrl : MonoBehaviour
{
    public GameObject joyStick, mainView, playView;
    public Button btn;
    Animator anim;
    GameObject coll;
    public Sprite use, kill;


    public float speed;
    public Settings settings_script;

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

    private void Start()
    {
        anim = GetComponent<Animator>();
        Camera.main.transform.parent = transform; //캐릭터 이탈 방지
        Camera.main.transform.localPosition = new Vector3(0, 0, -10);

        if (isMission)
        {// 미션
            btn.GetComponent<Image>().sprite = use;
        }
        else
        {// 킬퀘스트
            btn.GetComponent<Image>().sprite = kill;

        }
    }
    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);// 어떤 불값을 어떻게

            }
        }

    }

    // 캐릭터 삭제
    public void DestroyPlayer()
    {
        Camera.main.transform.parent = null;
        Destroy(gameObject);
    }

    //트리거와 접촉한 경우
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.tag == "Mission" && isMission)
        {
            coll = collision.gameObject;
            btn.interactable = true; 
        }

        if (collision.tag == "NPC" && !isMission)
        {// 킬게임이다
            coll = collision.gameObject;
            btn.interactable = true;
        }
    }

    //트리거와 떨어진경우
    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.tag == "Mission" && isMission)
        {
            coll = null;

            btn.interactable = false;
        }

        if (collision.tag == "NPC" && !isMission)
        {// 킬게임이다
            coll = null;
            btn.interactable = false;
        }
    }

    //버튼 누르면 호출
    public void ClickButton()
    {
        //미션 스타트를 호출
        // 미션 스타트 스크립트를 받아와야 하는데 간단하게 호출 가능
        coll.SendMessage("MissionStart");
        isCantMove = true;
        btn.interactable = false;


    }

    //미션 종료하면 호출
    // mission1파일에서 호출
    public void MissionEnd()
    {
        isCantMove = false;
    }
}

이전에 만들어 놨던 것 그대로 사용

kill과 use 버튼 추가!

실행하면 잘 된다!

728x90