読者です 読者をやめる 読者になる 読者になる

遊べるゲームを作りたい

作りたいです。

Unityで自作ゲームを作る チャージショット機能の準備

f:id:hogemarunosuke:20170207144230p:plain

遊び方

WASDキーで移動。スペースキーでジャンプ。マウスで視点移動。
左クリックで射撃。右クリックでロックオンモード。

左ダブルクリック後、クリックしっぱなしでチャージ、離してショット。を実装中。


最近、自宅で開発する時間がなかなか取れないので、会社で昼飯食いながらゲームを作っています。サムネの雰囲気がいつもと違うのはそのせいです。先輩、そんな怖い目で見ないでください。昼休み中!昼休み中ですから!

コントローラを使ったシューティングでは手連もしくはセミオートで通常ショット、ホールドでチャージショットといった感じが普通だと思いますが…。プレイヤーにマウスクリックをポチポチさせまくるという苦行を押し付けるのもアレですので、ダブルクリック後にホールド状態を維持し続けることでチャージできるようにしました。

using UnityEngine;

public class ChargeShot : MonoBehaviour
{
    public GameObject chargeShotBulletPrefab;

    private float speed = 0;
    private Vector3 direction;

    private GameObject player;

    private GameObject charge;
    private ParticleSystem chargeParticle;

    private bool doubleClickFlag = false;
    private float doubleClickThreshold = 0.5f;
    private float doubleClickTimer = 0;

    private bool charging = false;
    private float chargePower = 0;

    // Use this for initialization
    private void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player");

        charge = GameObject.Find("ChargeParticle");
        chargeParticle = charge.GetComponent<ParticleSystem>();
    }

    // Update is called once per frame
    private void Update()
    {
        if (doubleClickFlag)
        {
            doubleClickTimer += Time.deltaTime;
            if (doubleClickTimer > doubleClickThreshold)
            {
                doubleClickTimer = 0;
                doubleClickFlag = false;
            }
            else
            {
                if (Input.GetButtonUp("Fire1"))
                {
                    Fire();
                }
                else if (Input.GetButton("Fire1"))
                {
                    Charging();
                }
            }
        }
        else
        {
            if (Input.GetButtonUp("Fire1"))
            {
                Ready();
            }
        }

        // Update charging particle
        charge.transform.position = player.transform.position;
        if (charging)
        {
            if (chargeParticle.isStopped)
            {
                chargeParticle.Play();
            }
        }
        else
        {
            if (chargeParticle.isPlaying)
            {
                chargeParticle.Stop();
            }
        }
    }

    private void Ready()
    {
        doubleClickFlag = true;

        //Debug.Log("Ready.");
    }

    private void Charging()
    {
        doubleClickTimer = 0;

        chargePower += Time.deltaTime;
        charging = true;

        //Debug.Log("Charging...");
    }

    private void Fire()
    {
        doubleClickTimer = 0;
        doubleClickFlag = false;

        if (chargeShotBulletPrefab != null)
        {
            var chargeShotBullet = Instantiate(chargeShotBulletPrefab) as GameObject;
            chargeShotBullet.transform.position = player.transform.position;

            var chargeShotBulletScript = chargeShotBullet.GetComponent<ChargeShotBullet>();
            if (chargeShotBulletScript != null)
            {
                chargeShotBulletScript.SetSpeed(speed);
                chargeShotBulletScript.SetDirection(direction);
                chargeShotBulletScript.SetPower(chargePower);
            }
        }

        chargePower = 0;
        charging = false;

        //Debug.Log("Fire!");
    }

    public void SetSpeed(float speed)
    {
        this.speed = speed;
    }

    public void SetDirection(Vector3 direction)
    {
        this.direction = direction;
    }

    /// <summary>
    /// Use this checker to disable jumping, or disable shooting, or decrease movement speed, or anything.
    /// </summary>
    /// <returns>Now charging or not</returns>
    public bool IsCharging()
    {
        return this.charging;
    }
}

上記コードのようにダブルクリックの判定を強引に実装。それぐらいUnityのイベントにあると思ったのにー。有料アセットを探せばいくらでもありそうですが、すぐにアセットに頼るクセは悪いクセになりそうなので、自分で作れるものは極力自分で作るようにします。車輪の再発明サイコ~(゚∀゚)