
오른쪽 위에 Layout 누르면 [ 2 by 3 ]로 설정 후 수업을 시작했다.
그럼 위 스크린샷 처럼 화면이 바뀔 것이다.
그 다음에 Visual Studio 버전이 여러가지 설치 되어있을 경우


아래 처럼 버전을 선택할 수 있는데 수업에는 22버전으로만 하신다고 하셨다.

프로젝트에 보면 Assets가 있는데 원래 Scenes와 Settings 밖에 없을 것이다.
만약에 여러 오브젝트를 생성했다고 하자.
그럼 정리가 안된 상태로 있으면 나중에 찾기가 어렵다. 그렇기에 스크립트는 스크립트끼리 씬은 씬끼리 정리를 해주어야한다. 그래서 우리 수업에서는 00.Scences / 01.Scripts로 폴더를 만들어 주었다.

Hierarchy > 마우스 오른쪽 클릭 > 2D Object > Sprites > square
화면에 네모난 블럭이 나올 것이다.
그럼 오브젝트가 생성된 것이다.

씬은 이 부분이다.

왼쪽에 이 버튼은 위에서 부터
q / w / e / r / t / y 순서로 누르면 버튼이 눌려진다.
q - 화면이동
w - 오브젝트를 화살표로 이동할 수 있다.

e - 오브젝트를 돌릴 수 있다.

r - 크기를 변경할 수 있다.

t - 다양한 크기를 만들 수 있다.

y - 위 기능들을 한번에 쓸 수 있다.

01.Scripts안에 TestScript라는 스크립트 파일 하나를 만들어보자

!!! 파일 이름을 처음에 만들었다가 바꾸면 스크립트 파일 내에 클래스 명도 바꾸어주어야 하니 참고!

이 두가지가 보일 것이다.
void Start()
{
//첫번째 업데이트가 호출 되기 전에 한번 호출된다.
}
void Update()
{
//계속 호출되면서 업데이트 한다.
}
전에 C#할때는 콘솔창에 글을 출력했다.
그럼 유니티에서는 어디에 출력이 될까?
유니티도 콘솔창이 존재한다.

Window > General > Consol
하면 아래와 같은 콘솔창이 나온다.

그럼 스타트와 업데이트를 한번 실행해보자.
void Start()
{
//첫번째 업데이트가 호출 되기 전에 한번 호출된다.
Debug.Log("Start");
}
void Update()
{
//계속 호출되면서 업데이트 한다.
Debug.Log("Update");
}

맨위에 start한번 출력후 계속 update가 출력되는 것을 볼 수 있다.
간소화해서 보고 싶으면,

콘솔창에서 collapse를 눌러주면 어떤 디버그 로그가 나온지 알 수 있다.

오브젝트를 클릭하면 오른쪽에 transform이 보인다. 오브젝트들은 다 가지고 있음.
좌표, 크기, 회전 등을 수치로 가지고 있다.
speed = 5f;
isGround = false;
Vector3 vector3 = new Vector3(1, 1, 1);
void Update()
{
//이동
//Time.deltaTime 100프레임 사람과 60프레임인 사람이 똑같이 1초에 n만큼 움직이게 된다.
transform.Translate(Vector3.left * Time.deltaTime * speed);
//이동2
transform.position += Vector3.left * speed * Time.deltaTime;
}
위 코드를 script에 적고 ctrl + s 로 저장 후
unity에서

스크립트를 당겨서 add component 쪽으로 넣어주면 위에 script가 생긴다.
그 다음 실행해보면 상자가 이동하는 것이 보일 것이다.
[ 위 코드에서 Time.deltaTime이라는 것을 곱해줬는데 왜냐하면 저게 사람마다 프레임이 다른데 프레임이 달라도 같은 거리를 이동할 수 있도록 해준다고 한다. ]
Vector3 dir = Vector3.zero;
if (Keyboard.current.aKey.isPressed)
dir += Vector3.left;
if (Keyboard.current.sKey.isPressed)
dir += Vector3.down;
if (Keyboard.current.wKey.isPressed)
dir += Vector3.up;
if (Keyboard.current.dKey.isPressed)
dir += Vector3.right;
transform.position += dir.normalized * speed * Time.deltaTime;
업데이트 부분에 이 코드를 추가하면 wasd로 오브젝트를 이동할 수 있다.
public float speed;
코드 내에 public으로 선언을 해두면

스크립트 내에서 값을 변경해볼 수 있음.

오브젝트가 물리적인 판정을 가질 수 있게 하는 컴포넌트이다.
오브젝트가 충돌할 수 있도록 하는 컴포넌트이다.

바닥 오브젝트를 하나 만들어준다.
바닥 오브젝트에는
위처럼 Ground로 만들어 준다.
그럼 두개가 충돌 판정과 물리판정을 가지고 있기 때문에 네모 상자가 바닥에 떨어지면서 아까 만들어둔 wasd로 움직일 수 있을 것이다.
//변수 start위에
Rigidbody2D rb;
public bool isGround;
//Update부분
if (Keyboard.current.spaceKey.isPressed)
{
//땅에 있는지 확인
if (isGround)
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, 3);
isGround = false;
}
}
//클래스 내에 함수 생성
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Ground")
{
isGround = true;
}
}
점프키를 눌렀을 때 바닥에 붙어 있을 때 점프하도록 하는 코드다.
점프가 잘 되는 것을 확인할 수 있었다.
전체코드는 아래와 같다.
using UnityEngine;
using UnityEngine.InputSystem;
public class TestScript : MonoBehaviour
{
Rigidbody2D rb;
public bool isGround;
public float speed;
// 첫번째 업데이트가 호출 되기 전에 한번 호출된다.
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
speed = 5f;
isGround = false;
Vector3 vector3 = new Vector3(1, 1, 1);
Vector2 vector2 = new Vector2(1, 1);
Debug.Log("Start");
//위치
transform.position = vector3 * 2;
rb = GetComponent<Rigidbody2D>();
}
// start -> update -> update 순서로 이루어짐.
// Update is called once per frame
void Update()
{
//Debug.Log("Update");
//회전
//transform.Rotate(Vector3.forward);
////이동
////Time.deltaTime 100프레임 사람과 60프레임인 사람이 똑같이 1초에 n만큼 움직이게 된다.
//transform.Translate(Vector3.left * Time.deltaTime * speed);
////이동2
//transform.position += Vector3.left * speed * Time.deltaTime;
Vector3 dir = Vector3.zero;
if (Keyboard.current.aKey.isPressed)
dir += Vector3.left;
if (Keyboard.current.sKey.isPressed)
dir += Vector3.down;
if (Keyboard.current.wKey.isPressed)
dir += Vector3.up;
if (Keyboard.current.dKey.isPressed)
dir += Vector3.right;
if (Keyboard.current.spaceKey.isPressed)
{
//땅에 있는지 확인
if (isGround)
{
rb.linearVelocity = new Vector2(rb.linearVelocity.x, 3);
isGround = false;
}
}
//normalized ? 대각선의 길이는 더 큰데 대각선으로 더 이동하면 안되니까
//같은 이동속도로 같은 거리를 가도록 해준다.
transform.position += dir.normalized * speed * Time.deltaTime;
//transform.position += speed * Time.deltaTime * dir.normalized;
//두개는 아주아주 약간 값이 다르다. 아래쪽이 연산속도가 살짝 빠르다.
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.tag == "Ground")
{
isGround = true;
}
}
}