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를 만들어 준다.
콜라이드는 감지를 위한 것이므로 트리거 체크도 해주고, TAG도 추가해준다.
실행하면 잘 된다!
근데 버튼이 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;
}
}
이전에 만들어 놨던 것 그대로 사용
실행하면 잘 된다!
728x90
'개발 > 게임 교육' 카테고리의 다른 글
[Unity Class] 게임 교육 24 - 킬 애니메이션 만들기 (1) | 2024.01.07 |
---|---|
[Unity Class] 게임 교육 23 - 쿨타임 (0) | 2024.01.07 |
[Unity class] 게임 교육 21 - 미션 게이지바 만들기 (2) | 2024.01.06 |
[Unity class] 게임 교육 20 - 마지막 미션 2 마무리 (1) | 2024.01.06 |
[Unity class] 게임 교육 19 - 마지막 미션1 (0) | 2024.01.06 |