8 STRENGTH
유니티 6일차. C# 기본 문법, 라이프사이클, 키다운 움직임 본문
컬렉션과 제네릭
컬렉션 : C#에서 제공해주는 자료구조. 현재 사용 빈도는 낮음
제네릭 컬렉션 : 유니티에서 GetComponent<Text> 같은 코드에 있는 <> 부분을 의미
이 부분에 형태를 적어놓으면 그 형태만 취급하게 값이 설정됨. 지정자.
유니티에서 활용되는 제네릭 컬렉션 종류
T는 형태를 뜻하는 용어
1. Dictionary<T> : 게임에서 인벤토리 구현할 때 사용하며, 키와 값으로 구성되어 있음.
키는 중복이 불가능, 값은 중복이 가능
아이디 비밀번호 로그인 할 때 사용
2. List<T> : 게임에서 인벤토리 구현, UI패널 명단들, 랭킹 시스템 구현 등에서 활용될 수 있음
3. Queue<T> : 입력 순서와 출력 순서가 같음(반대인 애는 Stack). 게임의 다이얼로그 기능을 구현할 때 활용되는 컬렉션
c#에서 클래스는 프로그램 단위
MonoBehaviour는 유니티에서 생성하는 모든 스크립트가 상속받는 기본 클래스입니다.
상속 : 기존의 기능을 물려받는 것. MonoBehaviour에 있는 모든 스크립트의 기능을 우리의 클래스 Basic에 물려준다.
해당 부분은 크게 건드리지 않아도 문제가 되는 일은 없음.
따로 데이터 파일 등을 만들거나 하는 과정에서 상속이 사용되는 경우에는 따로 처리를 진행해줘야 하는 기능 중 하나입니다.
Basic.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
// using 문 : 작성한 위치에 있는 형태를 사용한다는 뜻을 가지고 있는 키워드
// 위의 코드는 System에 있는 Collections를 사용한다
// System에 있는 Collections에 있는 Generic을 사용한다
// UnityEngine을 사용한다
// C의 include와 유사
// 컬렉션과 제네릭
// 컬렉션 : C#에서 제공해주는 자료구조. 현재 사용 빈도는 낮음
// 제네릭 컬렉션 : 유니티에서 GetComponent<Text> 같은 코드에 있는 <> 부분을 의미
// 이 부분에 형태를 적어놓으면 그 형태만 취급하게 값이 설정됨. 지정자.
// 유니티에서 활용되는 제네릭 컬렉션 종류
// T는 형태를 뜻하는 용어
// 1. Dictionary<T> : 게임에서 인벤토리 구현할 때 사용하며, 키와 값으로 구성되어 있음.
// 키는 중복이 불가능, 값은 중복이 가능
// 아이디 비밀번호 로그인 할 때 사용
// 2. List<T> : 게임에서 인벤토리 구현, UI패널 명단들, 랭킹 시스템 구현 등에서 활용될 수 있음
// 3. Queue<T> : 입력 순서와 출력 순서가 같음(반대인 애는 Stack). 게임의 다이얼로그 기능을 구현할 때 활용되는 컬렉션
// c#에서 클래스는 프로그램 단위
// MonoBehaviour는 유니티에서 생성하는 모든 스크립트가 상속받는 기본 클래스입니다.
// 상속 : 기존의 기능을 물려받는 것. MonoBehaviour에 있는 모든 스크립트의 기능을 우리의 클래스 Basic에 물려준다.
// 해당 부분은 크게 건드리지 않아도 문제가 되는 일은 없음.
// 따로 데이터 파일 등을 만들거나 하는 과정에서 상속이 사용되는 경우에는 따로 처리를 진행해줘야 하는 기능 중 하나입니다.
public class Basic : MonoBehaviour
{
//함수 (Function) : 특정 하나의 명령을 진행시키기 위해 명령문을 묶어놓은 집합체
// Start is called before the first frame update
void Hello()
{
Debug.Log("안녕하세요");
}
int damage(int atk, int hp) // 매개변수(parameter) : 함수 안에다가 값을 넣어주기 위해 데이터의 형태를 작성해줌.
{
return hp - atk; // return은 함수를 종료시키고 호출된 위치에 작성한 값을 전달하는 역할
}
public int atk = 1;
public int hp = 50;
void Start()
{
}
// Update is called once per frame
void Update()
{
Hello();
hp = damage(atk, hp);
}
}
라이프 사이클 (생명 주기) : 프로그램이 만들어지고 사라지는 과정까지를 표현한 것
유니티의 라이프 사이클
시작 부분
Reset : 인스펙터 뷰에서 리셋 기능을 눌렀을 때 실행되는 영역, 초기 값 설정
Awake : Start를 진행하기 전에 한번 호출되는 영역
주로 GameObject.Find()같은 명령문들을 사용하는 영역
OnEnable : 인스펙터 뷰에서 체크를 통해서 게임 오브젝트를 활성화할 때 실행되는 영역
★Start : Update 전에 한 번 호출되는 영역, 시작 시에 할 작업을 적어주는 영역.
중간 부분 : 이벤트 영역
FixedUpdate : 디테일한 값 설정을 위해 일정 시간 간격으로 물리 엔진을 사용하는 영역.
사용 이유 : Update 영역은 프레임 단위이기 때문에 컴퓨터 성능에 따라 변화가 심할 수 있음. (업데이트 주기 시간이 정해져 있음)
게임 수학 등을 익혀서 특정 프로그램 작업에 대한 로직 등을 짤 때 사용됨.
onTriggerXXX (OnTriggerEnter, OnTrigger...) : onTrigger라고 이름 붙는 6종류의 함수는 오브젝트 간의 충돌 상황에서 작업이 진행되는 영역
1. onTriggerEnter, onTriggerEnter2D : 오브젝트 간의 충돌 시 호출
2. onTriggerStay, onTriggerStay2D : 오브젝트가 충돌하고 있는 동안 매 프레임마다 호출되는 영역
3. onTriggerExit, onTriggerExit2D : 오브젝트가 충돌에서 벗어났을 때 호출되는 영역
★onCollisionXXX : onCollision이라고 이름 붙는 6종류의 함수는 물리 법칙에 의한 영향 발생 시 호출되는 영역
Rigidbody(중력을 부여하는 기능)에서 Body Type이 하나라도 Dynamic으로 설정되어 있을 경우 처리되는 영역
프레임 부분 (프레임당 실행되는 부분)
★Update : 프레임마다 호출되는 함수 (주로 게임 핵심 로직을 이 영역에서 구현). 다만 프레임 주기가 상대적으로 일정하지 않을 수 있음(이를 맞춰주기 위해 FixedUpdate에서 작업)
LateUpdate : Update 함수가 실행되고 나서 호출되는 영역 (주로 카메라 이동 담당)
소멸 부분
OnDisable : OnEnable의 반대. 오브젝터, 스크립트가 비활성화될 때 호출되는 영역
☆OnDestroy : 오브젝트가 파괴 또는 제거되는 시기에 실행되는 영역. 주로 물건의 파괴, 장애물 구현 등에서 활용.
OnApplicationQuit : 응용 프로그램 종료 전에 호출되는 영역. 잘 안씀. 굳이 쓴다면 세이브 기능?
LifeCycle.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LifeCycleExample : MonoBehaviour
{
// 라이프 사이클 (생명 주기) : 프로그램이 만들어지고 사라지는 과정까지를 표현한 것
/* 유니티의 라이프 사이클
*
* 시작 부분
* Reset : 인스펙터 뷰에서 리셋 기능을 눌렀을 때 실행되는 영역, 초기 값 설정
* Awake : Start를 진행하기 전에 한번 호출되는 영역
* 주로 GameObject.Find()같은 명령문들을 사용하는 영역
* OnEnable : 인스펙터 뷰에서 체크를 통해서 게임 오브젝트를 활성화할 때 실행되는 영역
* ★Start : Update 전에 한 번 호출되는 영역, 시작 시에 할 작업을 적어주는 영역.
*
* 중간 부분 : 이벤트 영역
* FixedUpdate : 디테일한 값 설정을 위해 일정 시간 간격으로 물리 엔진을 사용하는 영역.
* 사용 이유 : Update 영역은 프레임 단위이기 때문에 컴퓨터 성능에 따라 변화가 심할 수 있음. (업데이트 주기 시간이 정해져 있음)
* 게임 수학 등을 익혀서 특정 프로그램 작업에 대한 로직 등을 짤 때 사용됨.
* onTriggerXXX (OnTriggerEnter, OnTrigger...) : onTrigger라고 이름 붙는 6종류의 함수는 오브젝트 간의 충돌 상황에서 작업이 진행되는 영역
* 1. onTriggerEnter, onTriggerEnter2D : 오브젝트 간의 충돌 시 호출
* 2. onTriggerStay, onTriggerStay2D : 오브젝트가 충돌하고 있는 동안 매 프레임마다 호출되는 영역
* 3. onTriggerExit, onTriggerExit2D : 오브젝트가 충돌에서 벗어났을 때 호출되는 영역
* ★onCollisionXXX : onCollision이라고 이름 붙는 6종류의 함수는 물리 법칙에 의한 영향 발생 시 호출되는 영역
* Rigidbody(중력을 부여하는 기능)에서 Body Type이 하나라도 Dynamic으로 설정되어 있을 경우 처리되는 영역
*
* 프레임 부분 (프레임당 실행되는 부분)
* ★Update : 프레임마다 호출되는 함수 (주로 게임 핵심 로직을 이 영역에서 구현). 다만 프레임 주기가 상대적으로 일정하지 않을 수 있음(이를 맞춰주기 위해 FixedUpdate에서 작업)
* LateUpdate : Update 함수가 실행되고 나서 호출되는 영역 (주로 카메라 이동 담당)
*
* 소멸 부분
* OnDisable : OnEnable의 반대. 오브젝터, 스크립트가 비활성화될 때 호출되는 영역
* ☆OnDestroy : 오브젝트가 파괴 또는 제거되는 시기에 실행되는 영역. 주로 물건의 파괴, 장애물 구현 등에서 활용.
* OnApplicationQuit : 응용 프로그램 종료 전에 호출되는 영역. 잘 안씀. 굳이 쓴다면 세이브 기능?
*/
// Start is called before the first frame update
void Start()
{
}
// Update is called once per frame
void Update()
{
}
}
부드러운 키다운 무빙
Test.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
{
void FixedUpdate()
{
Debug.Log("FixedUpdateTime : " + Time.deltaTime);
}
float speed = 5.0f;
// Update is called once per frame
void Update()
{
// 수평, 수직 입력(이동 기능 구현)
// 수평(Horizontal), 수직(Vertical)
// 키보드 입력
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
// 이동 속도 보정
h = h * speed * Time.deltaTime;
v = v * speed * Time.deltaTime;
//Time.deltaTime : The time in seconds it took to complete the last frame
// 한 프레임이 완료되기까지 걸리는 시간. 주로 움직임에서 이 값을 곱하여 프레임 당 이동을 구현하는 용도로 활용
// 성능의 영향을 받음.
// 실제 이동
transform.Translate(Vector2.right * h);
transform.Translate(Vector2.up * v);
}
}
화살 피하기 게임

ArrowController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ArrowController : MonoBehaviour
{
GameObject player;
void Start()
{
// 플레이어 오브젝트는 "player" 가 됩니다.
// GameObject.Find(오브젝트이름);
player = GameObject.Find("player");
}
// Update is called once per frame
void Update()
{
transform.Translate(0, -0.1f, 0);
if(transform.position.y < -5.0f)
{
Destroy(gameObject);
// 게임 오브젝트를 파괴해라.
}
// 충돌 판정
Vector2 p1 = transform.position; // 화살표의 좌표
Vector2 p2 = player.transform.position; // 플레이어의 좌표
Vector2 dir = p1 - p2; // 거리 체크
float d = dir.magnitude;
// magnitude는 vector에서 길이를 읽어오는 기능
float r1 = 0.5f; // 화살의 반경
float r2 = 1.0f; // 플레이어의 반경
// 충돌할 경우 화살과 플레이어를 지워버림
if (d < r1 + r2)
{
Destroy(gameObject);
Destroy(player);
Debug.Log("End");
}
}
}
PlayerController.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
// Update is called once per frame
void Update()
{
// 왼쪽 화살표가 눌렸을 때
if (Input.GetKeyDown(KeyCode.LeftArrow))
{
transform.Translate(-3, 0, 0);
}
// 오른쪽 화살표가 눌렸을 때
if (Input.GetKeyDown(KeyCode.RightArrow))
{
transform.Translate(3, 0, 0);
}
// 스페이스바가 눌렸을 때
if (Input.GetKeyDown(KeyCode.Space))
{
transform.Translate(0, 3, 0);
}
if (Input.GetKeyUp(KeyCode.Space))
{
transform.Translate(0, -3, 0);
}
if (Input.GetKeyDown(KeyCode.W))
{
transform.Translate(0, 3, 0);
}
if (Input.GetKeyUp(KeyCode.W))
{
transform.Translate(0, -3, 0);
}
}
}
'유니티' 카테고리의 다른 글
| 중간 점검) 유니티 기본 C# 문법 정리 2 (1) | 2022.09.23 |
|---|---|
| 중간 점검) 유니티 기본 C# 문법 정리 1 (0) | 2022.07.24 |
| 유니티 5일차. 스와이프 기능 (0) | 2022.07.21 |
| 유니티 4일차. (0) | 2022.07.21 |
| 유니티 3일차. RigidBody와 Asset Store, 유니티 튜토리얼 (0) | 2022.07.21 |