1일차
c# 공부할 겸, 게임 개발도 흥미가 있어서 해보려고 합니다..
unity랑 unreal 두 가지 프레임워크를 고민했는데 초창기이기도 하고 unreal engine을 쓸 정도의
컴퓨터 스펙이 안될거라고 판단해서 unity로 입문하게 됐습니다. 취미로 남는 시간에 하는거라 오래 걸릴듯해요 !
아이디어도 야무지게 생각해봐야되고..
unity download : https://unity.com/kr/download
unity hub를 다운로드했고, unity version은 lts version으로 선택했으며,
vs code에서 작업할거라 visual studio는 추가 설치하지 않았습니다. 또한 android가 1차적인 목표라서
android SDK관련 항목들은 추가 설치했습니다!
vs code에서는 extensions에서 unity tools(1.2.12), unity code snippets(2.2.5), c# (2.12.4) 설치했습니다!
게임 내에서 사용할 image들은 opengameart.org에서 다운로드하여 사용
게임 : 싱크홀
PC 게임에 싱크홀이라는 게임이 있다. 계속해서 내려가는 게임인데, 기본적으로 이 구성으로 만들것이다.
( 처음 게임을 만들기에 난이도도 적합한 것 같고, 여기서 여러 기능을 추가하면 괜찮다고 생각했다)
login background
시작을 이 화면으로 시작하고 땅을 뚫고 슬라임이 지하로 가는 여정? 이 시작되면 좋을 것 같아서 이 배경을 채택했다.
login? 시작? 화면으로 고정시켜두고 이미지를 넣었고 모바일 게임으로 만들것이기에
내려가는 게임이기에 가로보다는 세로로 폰을 두고 하면 편할것 같기 때문에 !! game에 1080x1920으로 해상도를 설정
이미지가 잘리는 현상이 있어서 이미지를 확장,축소하여 main camera의 사이즈에 맞게 맞췄다
여기서 시작 버튼으로 시작하면 너무 시시할거 같아서,
슬라임을 움직여서 구멍으로 빠지면 시작하도록 했다(사용자 입장에서는 직관적이지 못할수도 있으나 공부할겸 이것저것 해보고 싶은거 다~~~ 해볼 예정이라서, 대신 그나마 구멍으로 빠지면 시작이라는 것을 표시하기 위해 뭔가를 추가했다)
캐릭터 image로 슬라임 채택 ! (귀여워서, 또한 점프라던가 내려갔을때 착지모션이라던가 통통 튀면서 슬라임이랑 잘 어울릴 것 같다)
여러 요소가 하나의 이미지에 있어서 Inspector-> sprite Editor에서 분할해서 사용했다.
이것저것해서 시작화면은 이렇게 된다! 슬라임을 오른쪽으로 이동시켜서 start깃발로 가면 아래로 떨어지는 애니매이션을 보여주면서 시작이 되게 할 것이다!!!!!
하면서 배경위에 슬라임을 올렸는데 슬라임이 안보여서...찾아보니까 각 object마다 layer를 지정할 수 있다더라~~
layer를 다음과 같이 만들었다, (게임을 시작하고 화면을 구성하면서 추가될 듯...?)
캐릭터가 움직이다가 start 깃발을 넘어갈때 캐릭터가 뒤로 잘릴까봐 움직이는 캐릭터는 최상단 layer로 만들어두었다
그리고 inspector에 태그라는 것이 있는데 슬라임은 player 태그를 달았다 (우선 이것저것 만져보면서 있길래 해두었는데, 어떤 작용을 할 지는 아직 모름... 기본상태에서 슬라임이 통통 튀는 (default로 점프가 되는) 애니매이션을 추가하고 싶은데 다음에 공부해서 추가할 예정....)
드디어 ... 코딩
폴더로 관리, scripts에 c# script name : player로 생성하고 vs code를 통해 코딩 시작
기본적으로 생성된 코드가 있다. start method, update method가 있는데, 나는 키보드를 누를 시 캐릭터 이동을 하기위한 코드를 작성하기 위해 update쪽에 작성했다
캐릭터를 좌우로 움직이기 위해 다음의 코드를 작성했다 (x축만 변경했고, speed를 unity에서도 접근가능하도록 serialzeField를 추가하여 private float로 생성 -> 캐릭터가 화면 밖으로 나가는 현상 발생
코드로 해결하는 것도 좋지만, unity 옵션으로 해결이 가능하다고 한다. (speed는 5가 적절한것 같아서 5로 했다)
왼쪽, 오른쪽 벽을 생성했다 (collider 2d에서 box collider 2d를 채택했다.)
그 후 캐릭터에 물리법칙(rigidbody 2d를 적용시켰고, box collider 2d를 적용시켰다.)
이때, 중력때문에 캐릭터가 계속 떨어지는 것을 확인했다 -> 따라서 아래에 떨어지는 영역 이외에 벽을 더 생성
이제 오른쪽 키를 눌러서 오른쪽으로 쭉가면 떨어지게 된다!!!
2일차
stage_scene을 추가하고 이것저것 배경 버튼 등을 넣고 떨어지면 stage_scene으로 이동하게 했다
(처음에 안되더니 오류보니까 새로 만든 scene은 빌드에 추가해야됩니당...)
그런데 이렇게 무작정 scene을 만들기보다 player의 기능부터 모두 추가하는게 좋을 것 같다는 생각
(그러면 모든 scene에서 player는 복붙해서 넣고 조금 수정할것만 하면 될거 같아서..!!)
그래서 player에 점프기능도 추가해서 넣어놓기로 했다,
지금 만들고자 하는 게임에서 점프, 좌우방향키로만 조작할 것이기 때문에!!
정리하면, scene을 추가하는 것 보다는 player관련된 것부터 하기
그리고 lift cycle에 대해 공부하면서..
awake() : scene에서 object들을 생성될 때, 최초 실행
start() : update()실행 전 한 번 실행
FixedUpdate() : 물리연산을 업데이트
Update() : frame마다 업데이트
LateUpdate() : Update 영역 모두 실행 후 마지막으로 실행
OnDestroy() : object들이 삭제되기 직전에 실행
라는 느낌을 받았는데 아직 fixedupdate와 update, awake와 start를 구분하지 못해서 update,start만 사용했다...
이제 점프까지 된다!!, 점프력과 움직임속도는 SerializedFeild에 있었는데, 고정값으로 이제 사용하게 되어 뺐다.
player scripts인데 player와 ground라는 tag를 가진 object 중 하나라도 collision이 있으면 collision이 충동했는지 알 수 있다. 그래서 나는 충돌여부를 판단하고 바닥에 있으면 점프를 가능하도록 했다.
(나중에는 아이템을 끼면 2단점프가 가능하다던지 해야겠다.)
다음 scene으로 가는 코드는 starflag쪽에 바닥이 뚫려있는데 그렇게되면 중력으로 인해 player의 y좌표가 내려가서,
만약 threshhold보다 작게 내려가면 stage_scene으로 넘어가도록 했다.
처음에는 tag라는 것을 몰라서 scene에 있는 object 이름인 under_wall로 사용했었는데... tag라고 새롭게 지정할 수 있어서 tag에 ground를 추가하고 그것으로 설정해서 실행되도록했다.
이번에는 캐릭터가 좌/우를 이동할때, 정면을 보는게 아닌 좌/우를 바라보도록 추가!!
(아마도 key가 눌리면 image를 바꾸는 것이 있을까? 로부터 시작, 그런데 rotation을 시킬 수 있는 기능이 있으니 키를 눌르면 이미지를 바꾸는게 아니라 rotation을 시키면 되지 않을까?)
rotation을 하면 이미 이미지가 2d image라서 선으로 보이게 된다...image를 교체하도록 하자
우선 가만히 있는 상태에서 애미메이션을 추가해봤다.
이 세가지의 이미지를 player에 drag&drop해서 animation을 생성하고 추가했으며 속도가 너무 빨라서 이것저것누르다가
애니메이션에서 speed가 1로 설정되어있어서 0.3으로 줄여서 자연스럽게 애니매이션을 할 수 있었다.
이제, 오른쪽 왼쪽키를 누르면 다른 애니매이션을 보여주도록 하자
갑자기 생각난건데 player의 y축을 threshold보다 작아지면이 아니라 이것도 충돌관리를 하면 좋지않을까?
해서 portal이라는 것을 collider로 만들고 충돌하면 다음 scene으로 넘어가게 했다!
이러면 stage별 클리어시에 적절하게 이 함수를 사용할 수 있을 것이다.
애니매이션을 다시 만들어보자 (제대로)
windows -> animation -> animation들어가고 player hierarchy클릭
시간에 따라 이미지 넣기, 파라미터설정
점프는 나중에 추가해주자(마땅한 이미지가 없음) bool type으로 right, left를 왼쪽, 오른쪽 이동에 대한 파라미터로 설정
Has Exit Time non check, Prev source state 모든것에 있어 즉각적 실행으로 하였다 -> 성공! 이제 캐릭터가 왼쪽,오른쪽이동할때마다 이미지 애니메이션이 바뀐다. (근데 점프가 갑지가 안됨... 그리고 portal도 안된다 -> 왼쪽 오른쪽일때 collider이 없어서 그런듯? ) -> ground랑 portal tag가 사라져서 그랬던것 다시 tag넣어줘서 해결 (왜 tag가 초기화됐는지...)
이로써 첫씬에서 주인공의 움직임, 애니메이션은 모두 구현이 됐다!
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; // 장면 관리를 위해 필요
public class player : MonoBehaviour
{
private Rigidbody2D rigid;
private Animator animator;
private bool isJump, right_flag, animator_flag=false;
private float move_speed = 4, jump_force = 4; // 좌우 속도 및 점프력
void Start(){
rigid = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
void Update()
{
move();
jump();
}
private void move()
{
float horizontalInput = Input.GetAxis("Horizontal");
if (horizontalInput != 0 ){ animator_flag = true; } // 최초 좌,우 입력받기전 앞을 보기
if (animator_flag){ // 최초로 좌,우 입력받으면 그에 따라 좌or우를 보기
if(horizontalInput > 0){ right_flag = true; }
else if(horizontalInput < 0){ right_flag = false; }
animator.SetBool("right",right_flag);
animator.SetBool("left",!(right_flag));
}
Vector3 move_to = new Vector3(horizontalInput * move_speed * Time.deltaTime, 0f, 0f);
transform.Translate(move_to);
}
private void jump()
{
if(Input.GetKeyDown(KeyCode.Space) && !isJump)
{
rigid.AddForce(Vector2.up * jump_force, ForceMode2D.Impulse);
isJump = true;
}
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("ground")){ isJump = false; } // 바닥충돌감지
if (collision.gameObject.CompareTag("portal")){ SceneManager.LoadScene("stage_select_scene"); } // 해당 장면으로 이동
}
}
나중에는 db연결해서 rank로 stage clear기준으로 기능 추가할 것이며 costume, item 등등 추가할 예정
우선은 start portal로 갔을 때 다음 scene을 구현하자!
3일차
player에 관한 코드를 보다가 내가 왜 움직임을 vector3로 했지....란 생각을 했다(어차피 z없는 2d게임인걸)
그래서 vector2로 수정(move 쪽에서), 그리고 이것저것 코드를 이쁘게 수정 좀 했다 ( camel case로 통일한다던가 여러 줄에 걸쳐서 적어놨던 코드를 한 줄로 통합한다던가, 유니티에 method들이 카멜 케이스나 파스칼 케이스를 많이 쓰는거 같아서 ... 원래는 스네이크 케이스 신봉자인데 ㅠㅠ)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class Player : MonoBehaviour
{
private Rigidbody2D rigid;
private Animator animator;
private bool isJump, rightFlag, animatorFlag = false;
private float moveSpeed = 4f, jumpForce = 4f;
void Start()
{
rigid = GetComponent<Rigidbody2D>();
animator = GetComponent<Animator>();
}
void Update()
{
Move();
Jump();
}
private void Move()
{
float horizontalInput = Input.GetAxis("Horizontal");
if (horizontalInput != 0 && !animatorFlag){ animatorFlag = true; }
if (animatorFlag)
{
rightFlag = horizontalInput > 0;
animator.SetBool("right", rightFlag);
animator.SetBool("left", !rightFlag);
}
Vector2 moveVector = new Vector2(horizontalInput * moveSpeed * Time.deltaTime, 0f);
transform.Translate(moveVector);
}
private void Jump()
{
if (Input.GetKeyDown(KeyCode.Space) && !isJump)
{
rigid.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
isJump = true;
}
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("ground")){ isJump = false; } // 바닥 충돌 감지
if (collision.gameObject.CompareTag("portal")){ SceneManager.LoadScene("stage_select_scene"); } // 해당 장면으로 이동
}
}
왼쪽, 오른쪽 이동시 그에 해당하는 애니메이션이 전체실행되지 않는 오류가 있었다. 그래서 해결
'잡동사니' 카테고리의 다른 글
[jetbot]학습+가속 (0) | 2021.11.01 |
---|---|
노트북에서 rpi ssh connect ( lan ) (0) | 2021.05.18 |