티스토리 뷰

🕹️ 실습 (1945)

Player

public GameObject[] MyBullets; // 배열로 선언 가능

private void FireBullet()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        var i = Mathf.Min(GameManager.Instance.Power, 3);
        Instantiate(MyBullets[i], pos.position, Quaternion.identity);
    }
}

public void PowerUp()
{
    if (Power < 3)
    {
        Power++;
    }
    ShowPowerUpEffect();
}

private void ShowPowerUpEffect()
{
    GameObject effect = Instantiate(PowerUpEffect, transform.position, Quaternion.identity);
    Destroy(effect, 1);
}

PBullet

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.CompareTag("Monster"))
    {
        Destroy(collision.gameObject);
        collision.gameObject.GetComponent<Monster>().Damage();
    }
}

Monster

public void Damage()
{
    ShowEffect();
    DropItem();
    Destroy(gameObject);
}

private void ShowEffect()
{
    GameObject effect = Instantiate(ExplosionEffect, transform.position, Quaternion.identity);
    Destroy(effect, 1);
}

private void DropItem()
{
    int randomProb = Random.Range(1, 101);
    if (randomProb <= 50 && Player.Instance.Power < 3)
    {
        Instantiate(Item, transform.position, Quaternion.identity);
    }
}

Item

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.CompareTag("Player"))
    {
        Destroy(gameObject);
        collision.gameObject.GetComponent<Player>().PowerUp();
    }
}

Boss

BossHead의 애니메이션에 AddEvent로 함수 달기

// Boss

private int directionFlag = 1;
private int moveSpeed = 2;

public GameObject MyBullet;
public GameObject CircleBullet;
public Transform pos1;
public Transform pos2;

public GameObject ExplosionEffect;

void Start()
{
    StartCoroutine(FireCircle());
    StartCoroutine(FireMissile());
}

private void Update()
{
    if (transform.position.x >= 1)
    {
        directionFlag *= -1;
    }
    if (transform.position.x <= -1)
    {
        directionFlag *= -1;
    }

    transform.Translate(directionFlag * moveSpeed * Time.deltaTime, 0, 0);
}

IEnumerator FireMissile()
{
    while (true)
    {
        Instantiate(MyBullet, pos1.position, Quaternion.identity);
        Instantiate(MyBullet, pos2.position, Quaternion.identity);

        yield return new WaitForSeconds(0.5f);
    }
}

public void Damage()
{
    ShowEffect();
    //Destroy(gameObject);
}

IEnumerator FireCircle()
{
    //공격주기
    float attackRate = 3;
    //발사체 생성갯수
    int count = 30;
    //발사체 사이의 각도
    float intervalAngle = 360 / count;
    //가중되는 각도(항상 같은 위치로 발사하지 않도록 설정
    float weightAngle = 0f;

    //원 형태로 방사하는 발사체 생성(count 갯수 만큼)
    while (true)
    {

        for (int i = 0; i < count; ++i)
        {
            //발사체 생성
            GameObject clone = Instantiate(CircleBullet, transform.position, Quaternion.identity);

            //발사체 이동 방향(각도)
            float angle = weightAngle + intervalAngle * i;
            //발사체 이동 방향(벡터)
            //Cos(각도)라디안 단위의 각도 표현을 위해 pi/180을 곱함
            float x = Mathf.Cos(angle * Mathf.Deg2Rad);
            //sin(각도)라디안 단위의 각도 표현을 위해 pi/180을 곱함
            float y = Mathf.Sin(angle * Mathf.Deg2Rad);

            //발사체 이동 방향 설정
            clone.GetComponent<BBullet>().Move(new Vector2(x, y));
        }
        //발사체가 생성되는 시작 각도 설정을 위한변수
        weightAngle += 1;

        //3초마다 미사일 발사
        yield return new WaitForSeconds(attackRate);

    }
}

private void ShowEffect()
{
    GameObject effect = Instantiate(ExplosionEffect, transform.position, Quaternion.identity);
    Destroy(effect, 1);
}

private void OnBecameInvisible()
{
    Destroy(gameObject);
}
// BossHead

public GameObject BossBullet;

// 애니메이션에서 함수 사용
public void FireRIghtDown()
{
    GameObject go = Instantiate(BossBullet, transform.position, Quaternion.identity);
    go.GetComponent<BBullet>().Move(new Vector2(1, -1));
}

public void FireLeftDown()
{
    GameObject go = Instantiate(BossBullet, transform.position, Quaternion.identity);
    go.GetComponent<BBullet>().Move(new Vector2(-1, -1));
}

public void FireDown()
{
    GameObject go = Instantiate(BossBullet, transform.position, Quaternion.identity);
    go.GetComponent<BBullet>().Move(new Vector2(-0, -1));
}

💫 Tip!

다른 클래스 함수 호출하기

collision.gameObject.GetComponent<Monster>().Damage();

Private 인스펙터 사용하기

[SerializeField] // pirvat 인스펙터 사용하는 법
private GameObject powerUp;

발사체 원으로 발사하기

IEnumerator FireCircle()
{
    //공격주기
    float attackRate = 3;
    //발사체 생성갯수
    int count = 30;
    //발사체 사이의 각도
    float intervalAngle = 360 / count;
    //가중되는 각도(항상 같은 위치로 발사하지 않도록 설정
    float weightAngle = 0f;

    //원 형태로 방사하는 발사체 생성(count 갯수 만큼)
    while (true)
    {

        for (int i = 0; i < count; ++i)
        {
            //발사체 생성
            GameObject clone = Instantiate(CircleBullet, transform.position, Quaternion.identity);

            //발사체 이동 방향(각도)
            float angle = weightAngle + intervalAngle * i;
            //발사체 이동 방향(벡터)
            //Cos(각도)라디안 단위의 각도 표현을 위해 pi/180을 곱함
            float x = Mathf.Cos(angle * Mathf.Deg2Rad);
            //sin(각도)라디안 단위의 각도 표현을 위해 pi/180을 곱함
            float y = Mathf.Sin(angle * Mathf.Deg2Rad);

            //발사체 이동 방향 설정
            clone.GetComponent<BBullet>().Move(new Vector2(x, y));
        }
        //발사체가 생성되는 시작 각도 설정을 위한변수
        weightAngle += 1;

        //3초마다 미사일 발사
        yield return new WaitForSeconds(attackRate);

    }
}

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함