본문 바로가기

내 공부/Unity_

유니티 2D deltaTime 활용하여 화살떨어지게하기

반응형

2020/08/31 - [내 공부/Unity_Shader] - 유니티 2D 플레이어 좌우로 이동하기

 

유니티 2D 플레이어 좌우로 이동하기

화살표 피하기 만들거임 1. 게임화면 내 핸드폰 기종에 맞추기 (1440*3200) 가로모드로 게임할거니까 (3200*1440) 으로 설정 2. 플레이어 배치하기 position (0,- 3.6, 0) 3. 백그라운드 배치 position (0,0,0)..

yuuu0823.tistory.com

 

1. 화살표위치 변경했다. 

postion = (0, 6, 0)

 

2. 일단 책에 쓰여진대로 스크립트 적용하기

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrowController : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        
    }

    
    void Update()
    {
        transform.Translate(0,-0.1f,0);
        
        if(transform.position.y<-5.0f)
        {
            Destroy(gameObject);
        }
    }
}

난 이렇게 넣으면 화살표가 뚝뚝 끊기면서 떨어질줄알고  전에 포스팅했던데로 axis를 넣어봤더니 

움직이지도않았음

;

근데 저 코드만 넣어도 내가 생각한대로 잘 움직임 ^^;

머지? 

아무튼 화살이 떨어진다. 내가 생각한대로 아주이쁘게

 

화살떨어지는건 밑에 설명있음

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrowController : MonoBehaviour
{
    GameObject player;
    void Start()
    {
        this.player = GameObject.Find("player");
    }



    void Update()
    {
        transform.Translate(0,-0.1f,0);

        if (transform.position.y < -5.0f)
        {
            Destroy(gameObject);
        }

        Vector2 p1 = transform.position;
        Vector2 p2 = this.player.transform.position;
        Vector2 dir = p1 - p2;
        float d = dir.magnitude;
        float r1 = 0.5f;
        float r2 = 1.0f;

        if (d < r1 + r2)
        {
            Destroy(gameObject);
        }
        
    }
}

책에 나오는 내용은 이러했다.

고냥이와 화살표반경을 계산한건데...아무튼

p1 = 화살 중심좌표 / p2 = 플레이어 중심좌표

r1 = 화살 반경 / r2 = 플레이어 반경

 

플레이어의 좌표를 알기위해 Start 메서드에서 플레이어를 찾는다.

 

dir의 길이는 magnitude를 사용해 계산한다.

아무튼 두 오브젝트가 충돌하면 Destroy 메서드로 화살 오브젝트를 소멸시킨다.

 

이제 화살이 여러개 떨어지게 만들어야한다

 

빈 오브젝트에 화살이 생겨나는 스크립트를 넣어야한다.

스크립트 이름은 ArrowGenerator

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ArrowGenerator : MonoBehaviour
{
    public GameObject arrowPrefab;
    private float span = 0.5f;
    private float delta = 0;

    void Update()
    {
        this.delta += Time.deltaTime;
        if (this.delta > this.span)
        {
            this.delta = 0;
            GameObject go = Instantiate(arrowPrefab) as GameObject;
            int px = Random.Range(-11, 11);
            go.transform.position = new Vector3(px, 7, 0);
            
            ;
        }
        
    }
}

 

화살 인스턴스를 1초마다 한개씩 생성

 

화살 인스턴스는 Instantiate 메소드를 사용해 생성한다.

Instantiate 메소드는 매개변수로 프리팹을 전달하면 반환값으로 프리팹 인스턴스를 돌려준다.

화살의 x좌표는 -11 부터 11 사이에 불규칙하게 위치하도록 Random 클래스의 Range 메소드를 사용한다.

변수 span은 화살의 생성 간격을 뜻한다.

 

설정된 간격시간보다 델타 타임이 더 큰 경우  델타 타임은 0으로 설정되고

화살표 프리팹이 랜덤한위치 (-11,11) 에서 생성된다.

 

 

이거는 내가 코드를 잘못입력해서 거의 화살비가 쏟아져내렸음 ㅋㅋㅋㅋㅋㅋ

if 문안에 delta를 0으로 초기화시키는 걸 빼먹고 

this.delta += Time.deltaTime; 한줄을 더 써붙였더니 화살폭우가 생겨났다.

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

아무튼

이건줄 모르고 계속 span 값만 조절했으니 답답할 노릇이였음

 

저 오른쪽 상단에 달린 UI는 다음번에 ㅎ

 

반응형