영상을 보세요.. 얼마나 우당탕탕 이게요..
게임 만들면서 충돌 때문에 이렇게 스트레스 받은 적은 처음이라....
거의 3~4일동안.... (도대체 왜 때문인지도 모를..)
간단하게 만들려고 한거라, 다른 프로젝트에 영향을 주면 안되기에
피하기 게임은 여기서 종료.
다음을 기약 하도록 하고, 쓸만한 코드만 정리하도록 하겠습니다.
우선 시작하기전 이게임의 문제점을 말씀 드리자면..
1. 영상에서 Freeze Rotation Z를 켜두지 않았기 때문에 캐릭터가 점프를 하다가 넘어집니다..
( 키면 벽이랑 충돌이 안돼요.. 왜 일까요.. 왜 이러는지 아시는분.. 제발 알려주세요.. )
2. 스코어 Update가 안됩니다..
( 맵 아래에 Player가 부딪히지 않고 지나간 Object 갯수를 스코어로 지정하도록 하려 했지만
이것도 충돌 이벤트가 되지 않아서, Collider끼리 Trigger해도 Debug조차 뜨지않습니다..
아직 싱글턴 패턴 코드 작성이 익숙하지 않아서 그런것도 있고.. )
3. 캐릭터 이미지 회전이 안됩니다..
( 바라보는 방향으로 캐릭터 스프라이트 회전 시키려고 했으나
오브젝트 충돌들이 되면 할려했는데 충돌이 안되서 차마 못한.. )
등등 문제들이 많지만, 이걸 보시는 분들이 피하기 게임을 만들길 원하신다면
이러한 점들을 보완해서 완벽한 게임을 만드시기를 바래요..
Player 🌺
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//골드메탈님 강의 참고한 플레이어 스크립트
public class Player : MonoBehaviour
{
//움직임
public int Speed;
float Pmove;
public int JumpPower;
public int DJumpPower;
//컴포넌트
Rigidbody2D rigid;
Animator anim;
//불값
bool JDown;
bool JJDown;
public bool isJumping;
public bool isDJumping;
public bool isWalk;
bool isWall;
//결과창
public GameObject resultScreen;
//컴포넌트 불러오기
void Awake()
{
rigid = GetComponent<Rigidbody2D>();
anim = GetComponent<Animator>();
}
//호출
void FixedUpdate()
{
GetInput();
Move();
Jump();
}
//키 입력
void GetInput()
{
Pmove = Input.GetAxisRaw("Horizontal");
JDown = Input.GetButtonDown("Jump");
JJDown = Input.GetButtonDown("Jump");
}
//움직임
void Move()
{
Vector3 moveVelocity = Vector3.zero;
isWalk = false;
anim.SetBool("isWalk",false);
if(Pmove < 0)
{
anim.SetBool("isWalk",true);
anim.Play("Walk");
isWalk = true;
moveVelocity = Vector3.left;
}
else if(Pmove > 0)
{
anim.SetBool("isWalk",true);
anim.Play("Walk");
isWalk = true;
moveVelocity = Vector3.right;
}
transform.position += moveVelocity * Speed * Time.deltaTime;
}
//점프
void Jump()
{
//점프중이 아닐때 점프키를 누르면
if(JDown && !isJumping )
{
anim.SetBool("isJump",true);
isJumping = true;
Vector2 jumpVelocity = new Vector2(0,JumpPower);
rigid.AddForce (jumpVelocity,ForceMode2D.Impulse);
anim.Play("Jump");
}
//점프중에만 할 수 있는 더블 점프
else if(JJDown && isJumping &&!isDJumping )
{
anim.Play("DJump");
isDJumping = true;
rigid.AddForce (Vector2.up*DJumpPower,ForceMode2D.Impulse);
}
}
void OnCollisionEnter2D(Collision2D collision2D)
{
//무한 점프 방지 코드
if(collision2D.gameObject.tag == "Floor")
{
anim.SetBool("isJump",false);
isJumping = false;
isDJumping = false;
}
}
//총알이라는 태그에 부딪히게 되면 resultScreen이 나오게
void OnTriggerEnter2D(Collider2D collider2D)
{
if(collider2D.gameObject.tag == "Bullet")
{
resultScreen.SetActive(true);
}
}
}
변수들은 주석 처리를 해서 묶어 놓았으니 보시는데 불편함이 없으시길 바랍니다.!
확실히 진짜 개발 쌩 초보일때 골드메탈님의 코드를 보고 배운게 많기때문에
변수 명등.. 코드 구조들이 많이 비슷 한것 같아요.
어쨌든 키 입력 다음 움직임 코드 부터 해석 해볼께요.
move 🏃♀️
void Move()
{
Vector3 moveVelocity = Vector3.zero;
isWalk = false;
anim.SetBool("isWalk",false);
if(Pmove < 0)
{
anim.SetBool("isWalk",true);
anim.Play("Walk");
isWalk = true;
moveVelocity = Vector3.left;
}
else if(Pmove > 0)
{
anim.SetBool("isWalk",true);
anim.Play("Walk");
isWalk = true;
moveVelocity = Vector3.right;
}
transform.position += moveVelocity * Speed * Time.deltaTime;
}
Vector3를 moveVelocity란 변수로 만들어주고
Vector3.zero는 애니메이션. 걷지 않는 상태임을 작성해줍니다.
Pmove 버튼을 눌렀을때
0보다 작으면 음수 이므로 left.
0보다 크면 양수로 right
움직임에 Time.deltaTime 무조건 곱해주기.
Jump🧘♀️
void Jump()
{
//점프중이 아닐때 점프키를 누르면
if(JDown && !isJumping)
{
anim.SetBool("isJump",true);
isJumping = true;
Vector2 jumpVelocity = new Vector2(0,JumpPower);
rigid.AddForce (jumpVelocity,ForceMode2D.Impulse);
anim.Play("Jump");
}
//점프중에만 할 수 있는 더블 점프
else if(JJDown && isJumping &&!isDJumping)
{
anim.Play("DJump");
isDJumping = true;
rigid.AddForce (Vector2.up*DJumpPower,ForceMode2D.Impulse);
}
}
void OnCollisionEnter2D(Collision2D collision2D)
{
//무한 점프 방지 코드
if(collision2D.gameObject.tag == "Floor")
{
anim.SetBool("isJump",false);
isJumping = false;
isDJumping = false;
}
}
만약 점프 키를 눌렀을때 점프중이아니라면 실행할 조건문 ( Bool 연산자를 이용한 조건문 입니다. )
애니메이션 과 불값 true로 만들어주고 if문 맨 아래에 Play를 이용해 애니메이션 재생.
new Vector2로 만들어준뒤 JumpPower만큼 위로 올라가게, AddForce해줍니다..
더블점프도 비슷하게 코드 작성해줍니다.
그리고, Floor란 태그가 달린 오브젝트에 닿았을때
isJumping, isDJumping가 false 되게 하여 다시 점프가 가능하게 합니다.
그런데 이 코드가 문제인지 노트북이 문제인지 잘 모르겠지만
랜덤으로
isJumping과 isDJumping이 동시에 true가 되어 한번 점프키를 누른걸로도 더블점프 판정이됩니다..
여러가지 코드를 통해서 이 문제를 고치려고 노력했으나.. 이것 또한 뭐가 문제인지 잘 모르겠습니다..
( 완전 우당탕탕 )
결과 창 띄우기
void OnTriggerEnter2D(Collider2D collider2D)
{
if(collider2D.gameObject.tag == "Bullet")
{
resultScreen.SetActive(true);
}
}
Bullet이라는 태그에 Player가 닿으면
resultScreen이 켜지게 됩니다.
Bullet 💣
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Bullet : MonoBehaviour
{
public int Speed;
int Score;
GameManager gameManager;
void Awake()
{
gameManager = GameObject.Find("gameManager").GetComponent<GameManager>();
}
void Update()
{
transform.position += Vector3.down * Speed * Time.deltaTime;
Destroy(gameObject,10f);
}
void OnTriggerEnter2D(Collider2D collider2D)
{
if(collider2D.gameObject.tag == "Score")
{
Score += 1 ;
print("스코어 업");
}
}
}
이 코드는 제대로 작동 하는 부분이 Update밖에 없지만
제가 나중에 참고 할 수도 있기때문에 올려 두도록 하겠습니다.
원래 코드 기획이 GameManager와 bullet 스크립트를 연결해서, Bullet이 Score태그가 붙은 오브젝트에
부딪히면 GameManager에서 그걸 감지(?)하고 스코어를 올리는 방식으로 하고 싶었습니다...
일단 제대로 되는 Update만 보자면
transform.position은 += Vector2.down으로 위에서 아래로 내려오게끔 하였고
* Speed 움직임에 필수 *Time.deltaTime 해주었습니다.
그리고 10초뒤에는 알아서 Destory 됩니다.
( 원래는 Trigger로 Destroy 시켜주려고 했지만.. 이것도 Trigger 감지를 못해서.. 찾은 해결 방법입니다.)
BulletStart 🎊
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class BulletStart : MonoBehaviour
{
//조코딩님 플러피버드 랜덤파이프 코드 참고
//시간
float Timer = 0;
float TimerDiff = 1.5f;
//랜덤으로 생성 할 오브젝트
public GameObject Bullet;
void Update()
{
Timer += Time.deltaTime;
if(Timer > TimerDiff)
{
Instantiate(Bullet);
Bullet.transform.position = new Vector3(Random.Range(-8.37f,8.27f),5.93f,0);
Timer = 0;
}
}
}
오브젝트가 랜덤한 위치에서 생성되게 해주는 코드입니다.
TimeDiff로 랜덤으로 나올 딜레이..? 시간? 을 정해줍니다.
Instantiate로 클론이 생성되도록,(복제품)
그리고 Random.Range를 이용해서 범위를 지정해줍니다.
GameObject.transform.position = new Vector3(Random.Range(x,y,z)
형태입니다..
'🧩 코딩 > 사용한 코드' 카테고리의 다른 글
UnknownHero 코드 공유 / 오브젝트 360도 회전,아이템 떨어지기 (0) | 2023.05.15 |
---|---|
UNITY MBTI 테스트 앱 코드 / List 사용법 (0) | 2023.04.04 |
Unity2D 모바일 조이스틱을 이용한 움직임 코드 🏃♀️ Transform.localScale을 이용한 이미지 회전 (0) | 2022.10.20 |
리듬 게임 2강 - 게임 매니저,플레이어 / Trigger 이벤트로 텍스트 띄우기 / enabled를 이용한 애니메이션 / 움직이는 맵 (1) | 2022.10.07 |
Unity 리듬 게임 1강 - 노트 입력 코드 (3) | 2022.10.06 |