응용프로그램/유니티(Unity)

Unity - 근접했을때도 발사체 동작하게 하기

zelkova 2016. 11. 18. 13:24

<목차로 돌아가기>

 

  근접했을때도 발사체 동작하게 하기

출처 : Sebastian Lague

 

 

 

Projectile.cs

 

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class Projectile : MonoBehaviour {
  5.  
  6.     public LayerMask collisionMask;
  7.     float speed = 10;
  8.     float damage = 1;
  9.  
  10.     float lifetime = 3;
  11.     float skinWidth = 0.1f;
  12.  
  13.     void Start()
  14.     {
  15.         Destroy(gameObject, lifetime);
  16.  
  17.         Collider[] initialCollisions = Physics.OverlapSphere
  18.                                               (transform.position, 0.1f, collisionMask);
  19.         // 발사체와 겹쳐있는 모든 충돌체들의 배열
  20.         if (initialCollisions.Length > 0) 
  21.         //무엇 하나라도 충돌하였다면 충돌한 녀석에게 데미지를 가하고 파괴
  22.         {
  23.             OnHitObject(initialCollisions[0]);
  24.         }
  25.     }
  26.  
  27.     public void SetSpeed(float newSpeed)
  28.     {
  29.         speed = newSpeed;
  30.     }
  31.  
  32. void Update () {
  33.         float moveDistance = speed * Time.deltaTime;
  34.         CheckCollisioins(moveDistance);
  35.         transform.Translate(Vector3.forward * Time.deltaTime * speed);
  36.         
  37.         //레이의 이동할 거리와 충돌에 대한 거리를 가져와라
  38.     }
  39.  
  40.     void CheckCollisioins(float moveDistance)
  41.     {
  42.         Ray ray = new Ray(transform.position, transform.forward);
  43.         RaycastHit hit;
  44.  
  45.         if(Physics.Raycast(ray, out hit, moveDistance+skinWidth, 
  46.            collisionMask, QueryTriggerInteraction.Collide))
  47.         {
  48.             OnHitObject(hit);
  49.         }
  50.  
  51.     }
  52.     void OnHitObject(RaycastHit Hit)
  53.     {
  54.         IDamageable damageableObject = Hit.collider.GetComponent 
  55.                                                       <IDamageable>();
  56.         if (damageableObject != null)
  57.         {
  58.             damageableObject.TakeHit(damage, Hit);
  59.         }
  60.         GameObject.Destroy(gameObject);
  61.     }
  62.  
  63.     void OnHitObject(Collider c)
  64.     {
  65.      IDamageable damageableObject = c.GetComponent<IDamageable>();
  66.         if (damageableObject != null)
  67.         {
  68.             damageableObject.TakeDamage(damage);
  69.             GameObject.Destroy(gameObject);
  70.         }
  71.     }
  72. }

 

반응형