【Unity】~sier에서 게임업계까지~4-1회 유저

10108 단어 Unity

기본 기능


• 키보드 조작
• 공간을 누르면 점프
・[F]로 원거리 공격(fire)
• 적과 부딪칠 때 소리를 낸다

배운 곳


· 플레이어가 태그를 사용하여 적을 판정
참고한 사이트가 있지만 더 좋은 방법이 있는데...
평균 판정
참조된 웹 사이트는 OnTrigger Enter를 사용하지만 범위 내에 들어갈 때 한 번만 재생됩니다.
OnTriggerStay로 변경하면 추가 피해가 발생합니다.
그러나 판정이 너무 많기 때문에 무적 도층을 준비하고 코르크 테이프로 도층을 전환시켜 일정한 간격으로 판정해야 한다
(단, 여러 명의 적들이 한꺼번에 공격하면 이상하니 TODO를 수정해야 한다)

Player.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : BaseBehaviour
{

    public Vector3 vector;
    public CharacterController chara;
    public GameObject preFire;
    public AudioClip soundFire;
    public AudioClip soundEnemy;

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        // キーボードでの移動
        vector = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical")) * Time.deltaTime * 5;

        // 正面を向く処理
        var forward = Vector3.Slerp(transform.forward, vector, 360 * Time.deltaTime / Vector3.Angle(transform.forward, vector));
        transform.LookAt(transform.position + forward);

        // スペース:ジャンプ
        if (Input.GetKeyDown(KeyCode.Space))
        {
            vector.y = 3;
        }
        // F:攻撃
        else if (Input.GetKeyDown(KeyCode.F))
        {
            Fire();
        }

        // ジャンプの場合のために重力分下げる
        vector.y -= 9.8f * Time.deltaTime;

        chara.Move(vector);
    }

    /// <summary>
    /// 攻撃
    /// </summary>
    void Fire()
    {
        var posFire = new Vector3(this.gameObject.transform.position.x, this.gameObject.transform.position.y + 0.5f, this.gameObject.transform.position.z);
        Instantiate(preFire, posFire, transform.rotation);
        AudioSource.PlayClipAtPoint(soundFire, transform.position);
    }

    //void OnTriggerEnter(Collider col)
    void OnTriggerStay(Collider col)
    {
        if (col.gameObject.tag == "Enemy")
        {
            StartCoroutine("Damage");
        }
    }

    /// <summary>
    /// ダメージ処理
    /// </summary>
    /// <returns></returns>
    private IEnumerator Damage()
    {
        // 無敵用のレイヤーに変更
        // 当たり判定を一定間隔で行わせたいため
        gameObject.layer = LayerMask.NameToLayer("PlayerDamage");

        // 判定用に音をならす
        AudioSource.PlayClipAtPoint(soundEnemy, transform.position);

        yield return new WaitForSeconds(0.5f);

        // 元のレイヤーに戻す
        gameObject.layer = LayerMask.NameToLayer("Player");
    }
}

좋은 웹페이지 즐겨찾기