유니티/AA(3D 쿼터뷰 액션 게임)

AA(16) - 원거리무기 공격 구현

무직백수취업준비생 2021. 9. 17. 02:35
728x90
반응형

 

Trail Renderer을 이용해 날아가는 총알을 만들고 탄피는 에셋스토어에서 받은 뒤 

 

리지드바디와 박스콜라이더를 추가해줍니다.

 

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

public class Bullet : MonoBehaviour
{
    public int damage;

    void OnCollisionEnter(Collision collision) //충돌 로직 작성
    {
        if (collision.gameObject.tag == "Floor")
        {
            Destroy(gameObject, 3);
        }
        else if (collision.gameObject.tag == "Wall")
        {
            Destroy(gameObject);
        }
    }
}

총알이 벽과 닿으면 사라지고

 

탄피가 바닥에 닿으면 3초뒤 사라지도록 스크립트를 작성해줍니다.

 

 

원거리 공격 애니메이션과 트리거를 설정해줍니다.

 

    void Attack()
    {
anim.SetTrigger(equipWeapon.type == Weapon.Type.Melee ? "doSwing" : "doShot");
}

무기 타입에 따라 다른 애니메이션이 출력되도록 스크립트를 추가합니다.

 

    public Transform bulletPos;
    public GameObject bullet;
    public Transform bulletCasePos;
    public GameObject bulletCase;

 

총알과 총알이 출발할 좌표, 탄피와 탄피가 생성될 좌표를 선언해줍니다.

 

탄피가 생성될 좌표를 잡아줍니다.

 

선언한 변수에 오브젝트들을 할당해줍니다.

 

    public void Use()
    {
        if (type == Type.Melee)
        {
            StopCoroutine("Swing");
            StartCoroutine("Swing");
        }
        else if (type == Type.Range)
        {
            StartCoroutine("Shot");
        }
    }
    IEnumerator Shot()
    {
        //총알 발사
        GameObject intantBullet = Instantiate(bullet, bulletPos.position, bulletPos.rotation);
        Rigidbody bulletRigid = intantBullet.GetComponent<Rigidbody>();
        bulletRigid.velocity = bulletPos.forward * 50; //탄속 50

        yield return null;
        //탄피 배출
        GameObject intantCase = Instantiate(bulletCase, bulletCasePos.position, bulletCasePos.rotation);
        Rigidbody caseRigid = intantBullet.GetComponent<Rigidbody>();
        Vector3 caseVec = bulletCasePos.forward * Random.Range(-3, -2) + Vector3.up * Random.Range(2, 3);
        //탄피에 랜덤한 힘
        caseRigid.AddForce(caseVec, ForceMode.Impulse);
        caseRigid.AddTorque(Vector3.up * 10, ForceMode.Impulse);

    }

총알이 나가는 힘, 불규칙성을 주기 위해 랜덤 값 등을 스크립트로 작성합니다.

 

 

총알이 발사되지만 벽을 관통합니다.

 

스크립터만 작성하고 아직 게임환경에서 벽에 Wall태그가 설정되지 않았습니다.

 

오브젝트들에 태그를 설정해줍니다.

728x90
반응형