https://www.youtube.com/watch?v=A58_FWqiekI
- 최종결과물
에셋을 다운받는다.
- 아래의 에셋을 다운받아서 유니티에 import 한다.
https://kimchirun.xyz/assets.zip
배경을 만든다.
- 위에서 다운받은 에셋에서 하늘,건물,길의 이미지를 가져온다.
- 아래와 같이 각각의 이미지를 , 적당히 화면에 배치한다.
Scrolling Script
- 아래의 스크립트를 작성하여, 하늘,건물,길 을 각각 0.1, 0.2, 0.8로 입력한다.
using UnityEngine;
public class BackgroundScroll : MonoBehaviour
{
[Header("Settings")]
[Tooltip("Scroll 속도가 얼마나 빨라야하는가?")]
public float scrollSpeed;
[Header("References")]
public MeshRenderer meshRenderer;
void Update()
{
meshRenderer.material.mainTextureOffset += new Vector2(scrollSpeed * Time.deltaTime , 0);
}
}
Player : Run, Jump
- 아래와 같이 플레이어가 달리기,점프하기의 Sprite가 있다. 해당 Sprite를 사용하여 애니메이션을 완성하자
- 아래의 Player_run Sprite를 모두 선택하여, Scene에 드래그한다. Animation이 생성되는데 Player-run으로 생성한다.
- 해당 오브젝트의 이름을 Player로 변경하고 , Rigidbody 2d (Gravity Scale:2.5) , Box Collider 2D를 추가한다.
- Platform에 Box Collider 2D를 추가하고, 충돌할 바닥을 적당히 설정한다.
- 실행하면 아래와 같이 플레이어가 달리는 동작이 나온다.
- Jump Animation을 위해서 점프하는 동작을 아래와 같이 2개로 나누어서, Player-jump , Player-land 이렇게 2가지 Animation을 생성한다. (Samples 는 12로 한다.)
- Animatior창에서 각각의 Animation이 있는데, 일단 int형 변수 state를 생성한다.
- Make Transition을 사용하여 아래와 같이 연결한다.
- 각각의 트랜지션은 아래와 같이 설정한다. (state가 1이면 Jump, 2라면 Land)
- Player Script는 아래와 같다.
- JumpForce : 점프할때 파워이다. 값이 클수록 높이 점프한다.
- PlayerRigidBody , PlayerAnimator : 해당 플레이어의 레퍼런스객체이다.
- isGrounded : 연속점프를 막기위해서 true라면 땅에 접해있는상태이다. false라면 점프중인상태라 점프할수없다.
- 동작설명
- Space키를 누르면 Update()에서 해당 키를 체크하여, AddForceY를 하여 위로 점프하고, 애니메이션을 위하여 state를 1로 변경한다.
- OnCollisionEnter2D()는 바닥과 충돌하면 호출되어 state를 2로 바꿔서 애니메이션을 달리기 상태로 변경하고, 다시 점프가 가능하도록 isGrounded를 true로 설정한다.
using UnityEngine;
public class Player : MonoBehaviour
{
[Header("Settings")]
public float JumpForce;
[Header("Reference")]
public Rigidbody2D PlayerRigidBody;
public Animator PlayerAnimator;
private bool isGrounded = true;
// Update is called once per frame
void Update()
{
if(Input.GetKeyDown(KeyCode.Space) && isGrounded)
{
PlayerRigidBody.AddForceY(JumpForce, ForceMode2D.Impulse);
isGrounded = false;
PlayerAnimator.SetInteger("state", 1);
}
}
private void OnCollisionEnter2D(Collision2D collision)
{
if(collision.gameObject.name == "Platform")
{
if(!isGrounded)
{
PlayerAnimator.SetInteger("state", 2);
}
isGrounded = true;
}
}
}
건물을 만들자
- 건물스프라이트가 5개가 있는데, 일단 아무거나 선택해서 Hierarchy에 드래그하여 오브젝트를 생성하자.
- 아래의 스크립트를 만들자. 해당 스크립트는 건물을 이동시키는데, moveSpeed의 속도로 이동한다.
using UnityEngine;
public class Mover : MonoBehaviour
{
[Header("Settings")]
public float moveSpeed = 1f;
// Update is called once per frame
void Update()
{
transform.position += (Vector3.left * moveSpeed * Time.deltaTime);
}
}
- 화면밖으로 나가면 더이상 필요없으므로 삭제를 하도록 하자.
using UnityEngine;
public class Destroyer : MonoBehaviour
{
// Update is called once per frame
void Update()
{
if(transform.position.x < -15)
{
Destroy(gameObject);
}
}
}
- 아래와 같이 해당 스크립트를 건물에 적용하였다.
- 실행하면 아래와 같이 건물이 오른쪽에서 왼쪽으로 이동하고(Mover Script), 화면을 넘어가면 삭제가된다.(Destroy Script)
- 건물이 5개라서 아래와 같이 Prefab으로 생성한다.
- Spawner클래스를 만들어서 아래와 같이 입력한다.
using UnityEngine;
public class Spawner : MonoBehaviour
{
[Header("Settings")]
public float minSpawnDelay; // 최소 생성시간
public float maxSpawnDelay; // 최대 생성시간
[Header("References")]
public GameObject[] gameObjects;
// Start is called once before the first execution of Update after the MonoBehaviour is created
void Start()
{
Invoke("Spawn", Random.Range(minSpawnDelay,maxSpawnDelay));
}
void Spawn()
{
var randomObject = gameObjects[Random.Range(0, gameObjects.Length)];
Instantiate(randomObject, transform.position, Quaternion.identity);
Invoke("Spawn", Random.Range(minSpawnDelay, maxSpawnDelay));
}
}
- Create Empty를 사용하여 빈 오브젝트를 만들고, 이름을 Building Spawner로 한후에 위의 스크립트를 넣는다.
- 해당 스크립트의 min,max 값을 2,4로 설정하고(2~4초마다 건물이 생성된다.)
- gameObjects에 위에서 만든 건물 프리팹 5개를 넣는다.
- 해당 스크립트를 실행하면 2-4초마다 Invoke가 실행되어 건물이 생성된다.
- 실행하면 2-4초마다 건물이 생성되어, Mover스크립트에서 왼쪽으로 이동하고, Destroy스크립트에 의해서 화면밖으로 나가면 삭제된다.
'Unity' 카테고리의 다른 글
블랜더 (0) | 2024.12.24 |
---|---|
2025년2월2주 (0) | 2024.12.24 |
2025년2월1주(2/3~2/9) 무료 서버 구축하기 (0) | 2024.12.24 |
2025년1월5주(1/27~2/2) (0) | 2024.12.24 |
2025년1월 2주 (0) | 2024.12.24 |