유니티를 처음 배우기 시작했던 4월 초에 진행했던 실습을 기록하기 위해 늦게 글을 쓴다.
유니티 기본 제공 튜토리얼을 응용한 미니 게임으로, 유튜브에서 골드메탈님 영상을 참고해 제작했다.
참고 영상은 마지막에 링크를 달아두었다.
진행방식은 player가 공으로, 해당 스테이지의 아이템을 모두 먹은 후 터치포인트에 도달하면 다음스테이지로 이동하는 식이다.
아래 사진들은 내가 구성한 스테이지1~3의 모습이다.
스크립트는 총 4개로 구성했다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //게임 다시시작을 위한 라이브러리
public class PlayerBall : MonoBehaviour
{
Rigidbody rigid; //해당 리지드바디
public float jumpPower;
bool isJump; //이중 점프 방지를 위해
public int itemCount;
AudioSource audio;
public GameManager manager; //매니저 변수에 게임매니저 직접드래그해서 넣어주면됨
//게임매니저에있는 토탈 아이템 카운트 변수를 쓰기 위함.
void Awake()
{
isJump = false; //초기화
rigid = GetComponent<Rigidbody>(); //이 스크립트를 refer하는 오브젝트에서 리지드바디를 가져옴
audio = GetComponent<AudioSource>();
}
void Update()
{
if(Input.GetButtonDown("Jump") && !isJump) //점프 구현
{
isJump = true;
rigid.AddForce(new Vector3(0, jumpPower, 0), ForceMode.Impulse);
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
//Input.GetAxisRaw("Horizontal") : 좌우 예약어. 왼쪽 방향키 누르면 -1, 오른쪽 방향키 누르면 1 반환
//"Vertical"은 상하.
rigid.AddForce(new Vector3(h, 0, v), ForceMode.Impulse);
//해당 방향으로 업데이트 될 때마다 힘을 줌
//방향키에 맞게끔 수평 수직 이동
//ForceMode는 4가지가 있는데, 어떤식으로 힘을 전달할 것인가에 대한 것
//Impulse는 불연속 + 질량 무시x
}
void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.tag=="Floor")
{
isJump = false; //볼이 땅에 닿으면 다시 false로 바꿔줌
}
}
void OnTriggerEnter(Collider other)
{
if (other.tag == "Item")
{
other.gameObject.SetActive(false); //오브젝트 비활성화 함수 : 없어지게함(안보이게?)
itemCount++;
audio.Play();
manager.GetItem(itemCount);
}
else if(other.tag =="Finish")
{
if(itemCount == manager.TotalItemCount)
{
//Game Clear!
if(manager.stage==2)
{
SceneManager.LoadScene(0);
}
else
SceneManager.LoadScene(manager.stage+1);
}
else
{
//Restart..
SceneManager.LoadScene(manager.stage);
}
}
}
}
Ball에 있는 스크립트.
Addforce를 이용해서 이동을 하는 간단한 방식이다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
public int TotalItemCount;
public int stage;
public Text stageCountText;
public Text playerCountText;
void Awake()
{
stageCountText.text = "/ " + TotalItemCount.ToString();
}
public void GetItem(int count)
{
playerCountText.text = count.ToString();
}
private void OnTriggerEnter(Collider other)
{
if (other.gameObject.tag == "Player")
SceneManager.LoadScene(stage);
}
}
게임매니저 스크립트.
ball개수에 대한 UI와 낙사하는 경우를 관리한다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ItemCan : MonoBehaviour
{
public float rotateSpeed;
void Update()
{
transform.Rotate(new Vector3(1,1,0)*rotateSpeed*Time.deltaTime, Space.World);
//up : y축(0,1,0) (global 축 기준)
//*회전속도
//업데이트에서 움직인다 하면 *Time.deltaTime : 어떠한 컴퓨터든 환경에서든 동일한 시간
//is trigger 체크!!! : 물리적인 충돌 필요x
}
}
아이템 프리팹에 있는 스크립트.
스스로 회전하게끔 구현돼있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CameraMoving : MonoBehaviour
{
Vector3 Offset;
Transform playerTransform;
void Awake()
{
playerTransform = GameObject.FindGameObjectWithTag("Player").transform;
Offset = transform.position - playerTransform.position;
}
void LateUpdate()
{
transform.position = playerTransform.position + Offset;
}
}
카메라 스크립트
플레이어를 따라가도록 구현했다.
해당 프로젝트를 담아놓은 링크이다.
Practice-Unity/Project_Roll A Ball at main · jjiing/Practice-Unity (github.com)
GitHub - jjiing/Practice-Unity
Contribute to jjiing/Practice-Unity development by creating an account on GitHub.
github.com
참고한 영상링크.
(37) 기초만 꾹꾹 눌러담은 3D 게임 만들기 [유니티 입문 강좌 BE1] - YouTube
'C# > C# 학습 (TIL)' 카테고리의 다른 글
C# 오브젝트 풀링 (0) | 2022.06.26 |
---|---|
C# OverlapSphere / 콜라이더 배열 (0) | 2022.06.26 |
C# 중급문법 Day9 디자인패턴 : 커맨드패턴, 퍼사드패턴 (0) | 2022.06.24 |
C# 중급문법 Day8 Coroutine (코루틴) (0) | 2022.06.23 |
C# 중급문법 Day7 Reflection / DeepCopy 일반화(reflection 적용) (0) | 2022.06.22 |