Skip to content

develop MagicWand

Seong Hyeok OH edited this page Mar 25, 2023 · 3 revisions

준비

  • 프리팹
    • image
    • image
    • image
  • 애니메이션
    • 발사 모션(bolt1, bolt2, bolt3, bolt4)
    • 임팩트(Hit-1-1,Hit-1-2,Hit-1-3,Hit-1-4,Hit-1-5)
    • image

스크립트

  • SkillfiringSystem.cs

...
            case 1:     // MagicWand
                if (!weapon.isEvoluction())
                {
                    weapon.GetComponent().FireMagicWand(weaponPrefabs[1]);
                }
                else
                {
                    weapon.GetComponent().FireMagicWand(evolutionWeaponPrefabs[1]);
                }
...

  • MagicWand.cs

public class MagicWand : MonoBehaviour
{
    [SerializeField] Animator animator;
    public Weapon ownWeapon;

    float timer = 0;
    bool useWand = false;
    int touch = 0;
    int touchLimit;
    private void Start()
    {
        ownWeapon = GetComponent();
        animator = GetComponent();
    }
    private void FixedUpdate()
    {
        if (!useWand) return;  //MagicWand 사용 안할 때 Update를 안 함
        if (touchLimit <= touch)
        {
            animator.SetBool("Hit", true);
            Destroy(this.gameObject);
        }
    }
    public void FireMagicWand(GameObject objPre)
    {
        timer += Time.deltaTime;
        if (timer > ownWeapon.WeaponTotalStats[((int)Enums.WeaponStat.Cooldown)])
        {
            for (int i = 0; i < ownWeapon.WeaponTotalStats[((int)Enums.WeaponStat.Amount)]; i++)
            {
                //무기 세팅
                GameObject newobs = Instantiate(objPre, GameObject.Find("SkillFiringSystem").transform);
                newobs.transform.position = GameManager.instance.player.transform.position;
                MagicWand newWand = newobs.GetComponent();
                newWand.useWand = true;
                newWand.touchLimit = (int)ownWeapon.WeaponTotalStats[(int)Enums.WeaponStat.Piercing];
                Vector3 direction = FindClosestEnemyDirection();
                float angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg;
                //무기가 바라보는 방향 조절
                newobs.transform.rotation = Quaternion.AngleAxis(angle + 180, Vector3.forward);     //180은 이 스프라이트에 맞게 보정한 값
                //무기 발사
                Rigidbody2D rb = newobs.GetComponent();
                rb.velocity = direction * ownWeapon.WeaponTotalStats[((int)Enums.WeaponStat.ProjectileSpeed)];
            }
            timer = 0;
        }
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {
        if (collision.gameObject.tag == "Monster")
        {
            touch++;
        }
    }
    private GameObject FindClosestEnemy() 
    {
        GameObject[] enemies = GameObject.FindGameObjectsWithTag("Monster");
        GameObject closestEnemy = null;
        float closestDistance = Mathf.Infinity;

        //적 탐색
        foreach (GameObject enemy in enemies)
        {
            float distance = Vector3.Distance(transform.position, enemy.transform.position);

            if (distance < closestDistance) //소환된 무기와 몬스터 가장 짧은 거리 업데이트
            {
                closestEnemy = enemy;
                closestDistance = distance;
            }
        }
        return closestEnemy;
    }
    public Vector3 FindClosestEnemyDirection()
    {
        GameObject closestEnemy = FindClosestEnemy();
        Debug.Log(closestEnemy);
        if (closestEnemy != null)
        {
            Vector3 direction = closestEnemy.transform.position - transform.position;
            return direction.normalized;
        }
        else
        {
            return Vector3.right;
        }
    }
}

Clone this wiki locally