유니티 심화

가장 가까운 무기 장비하기 + 배럴 공격하기

송현호 2023. 8. 21. 18:21
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace Overlap
{
    public class OverlapPlayer : MonoBehaviour
    {
        [SerializeField]
        private float radius = 10f;
        private GameObject closestWeapon;
        private float closestWeaponDistance = Mathf.Infinity;
        [SerializeField]
        private Transform weaponHolder;
        private int num;

        private Collider[] colls = new Collider[6];

        private GameObject targetBarrel;
        private float targetBarrelDistance = Mathf.Infinity;

        [SerializeField]
        private GameObject bullet;
        private void Start()
        {
            int layerMask = 1 << LayerMask.NameToLayer("Gun");
            int cnt = Physics.OverlapSphereNonAlloc(this.transform.position, this.radius, colls, layerMask);

            for (int i = 0; i < cnt; i++)
            {
                float distance = (colls[i].transform.position - this.transform.position).magnitude;
                if (distance < closestWeaponDistance)
                {
                    this.closestWeaponDistance = distance;
                    this.closestWeapon = colls[i].gameObject;
                    this.num = i;
                }
            }
            Destroy(colls[num].gameObject);
            GameObject go = Instantiate(this.closestWeapon, this.weaponHolder);
            go.transform.localPosition = Vector3.zero;
            go.transform.localRotation = Quaternion.identity;

        }
        private void Update()
        {
            GameObject[] barrels = GameObject.FindGameObjectsWithTag("Barrel");

            foreach (GameObject barrel in barrels)
            {
                float distance = (barrel.transform.position - this.transform.position).magnitude;
                if (distance <= targetBarrelDistance)
                {
                    this.targetBarrelDistance = distance;
                    this.targetBarrel = barrel;
                }
            }

            if (Input.GetMouseButtonDown(0))
            {
                Attack(targetBarrel);
            }
        }

        private void Attack(GameObject target)
        {
            this.transform.LookAt(target.transform.position);
            GameObject go = Instantiate(bullet);
            go.transform.position = this.transform.position;
            go.transform.LookAt(target.transform.position);

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

namespace Overlap
{
    public class OverlapBullet : MonoBehaviour
    {
        private Rigidbody rb;
        // Start is called before the first frame update
        void Start()
        {
            this.rb = GetComponent<Rigidbody>();
            rb.AddForce(Vector3.forward * 1500f);
        }
    }
}