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

AA(20) - 수류탄 구현

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

 

수류탄 오브젝트를 만들고 물리력을 위해 리지드바디와 콜라이더, 잔상을 남기기 위해 트레일 렌더러 컴포넌트를 추가합니다.

 

 void Grenade()
    {
        if (hasGrenades == 0)
            return;
        if (gDown && !isReload && !isSwap)
        {
            Ray ray = follwCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit rayHit;
            if (Physics.Raycast(ray, out rayHit, 100))
            {
                Vector3 nextVec = rayHit.point - transform.position;
                nextVec.y = throwpower;

                GameObject instantGrenade = Instantiate(grenadeObj, transform.position, transform.rotation);
                Rigidbody rigidGrenade = instantGrenade.GetComponent<Rigidbody>();
                rigidGrenade.AddForce(nextVec, ForceMode.Impulse);
                rigidGrenade.AddTorque(Vector3.back * 10, ForceMode.Impulse);

                hasGrenades--;
                grenades[hasGrenades].SetActive(false);
            }
        }

 

스크립트를 작성하여 투척하는 물리법칙을 구현합니다.

 

이펙트까지 넣은 뒤 투척이 정상적으로 구현됩니다.

 

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

public class Grenade : MonoBehaviour
{
    public GameObject meshObj;
    public GameObject effectObj;
    public Rigidbody rigid;
    // Start is called before the first frame update
    void Start()
    {
        StartCoroutine(Explosion());
    }
    IEnumerator Explosion()
    {
        yield return new WaitForSeconds(2f);
        rigid.velocity = Vector3.zero;
        rigid.angularVelocity = Vector3.zero;
        meshObj.SetActive(false);
        effectObj.SetActive(true);

        RaycastHit[] rayHits = Physics.SphereCastAll(transform.position, 3, Vector3.up, 0f, LayerMask.GetMask("Enemy"));

        foreach(RaycastHit hitObj in rayHits)
        {
            hitObj.transform.GetComponent<Enemy>().HitByGrenade(transform.position);
        }
        Destroy(gameObject, 3);
    }


}
    public void HitByGrenade(Vector3 explosionPos)
    {
        curHealth -= 100;
        Vector3 reachVec = transform.position - explosionPos;
        StartCoroutine(OnDamage(reachVec, true));
    }

 

스크립트를 작성합니다.

 

피격테스터에 정상적으로 수류탄이 반응합니다.

728x90
반응형