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
반응형
'유니티 > AA(3D 쿼터뷰 액션 게임)' 카테고리의 다른 글
AA(22) - 캐릭터 피격 구현 (0) | 2021.09.27 |
---|---|
AA(21) - 플레이어 추격하는 몬스터 AI 구현 (0) | 2021.09.23 |
AA(19) - 벽 뚫기 방지 (0) | 2021.09.17 |
AA(18) - 공격 방향 설정 (1) | 2021.09.17 |
AA(17) - 원거리무기 재장전 (0) | 2021.09.17 |