質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.49%

  • C#

    9211questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    5635questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

スクリプトがif文ばかりになる

解決済

回答 3

投稿

  • 評価
  • クリップ 8
  • VIEW 4,269

lkiuxc

score 19

こんにちは。まだラムダ式などが良く解らず勉強中なのですが、趣味でUnityを使いゲームを作っています。

早速本題に。スクリプトを使いプレイヤーを動かしたりしているのですが、if文がとても多いんです。例えば

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

public class EnemyTestRoutine : MonoBehaviour {

    [SerializeField]
     GameObject enemyBullet;

    [SerializeField]
    GameObject player;


    [SerializeField]
    Rigidbody rb;

    private float shotTime = 0.05f;
    private bool shot = true;

    private float specialShotTime = 40;
    private bool specialShot = true;

    private float power = 80;
    private float speed = 30;
    Vector3 playerPoint;

    private float move = 10;
    int movePoint;

    private Vector3 escapeSky;

    private float downLimit = 5;
    private Vector3 down;

    private float capriciousDown = 3;
    private Vector3 capricious;

    private int Life = 10;

    // Use this for initialization
    void Start () {
        specialShot = false;
        move = 10;
        movePoint = Random.Range(0, 4);
        escapeSky = Vector3.zero;
        capricious = Vector3.zero;
    }
        Vector3 EnemyMove(int move)
    {
        switch (move)
        {
            case 0:
                return rb.velocity = transform.right * speed;

            case 1:
                return rb.velocity = -transform.right * speed;

            case 2:
                return rb.velocity = (-transform.forward / 2 + transform.right * 2) / 2 * speed;

            case 3:
                return rb.velocity = (-transform.forward / 2 + -transform.right * 2) / 2 * speed;
        }
        Debug.Log("EnemyMoveError");
        return rb.velocity = Vector3.zero;
    }

    void SpecialShot()
    {
        Quaternion nin = Quaternion.LookRotation(player.transform.position - transform.position);
        for (int red = -40; red <= 40; red += 6)
        {
            Quaternion r = nin * Quaternion.Euler(0, red, 0);
            GameObject bullets = Instantiate(enemyBullet, gameObject.transform.position, r);
            bullets.GetComponent<Rigidbody>().AddForce(bullets.transform.forward * power, ForceMode.Impulse);
        }

    }

    void Shot()
    {
        Quaternion nin = Quaternion.LookRotation(player.transform.position - transform.position);
        GameObject bullets = Instantiate(enemyBullet, gameObject.transform.position, nin);
        bullets.GetComponent<Rigidbody>().AddForce(transform.forward * power, ForceMode.Impulse);
    }

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player1Bullet"))
        {
            Debug.Log("hit");
        }
    }
    // Update is called once per frame
    void Update () {
        transform.LookAt(player.transform.position);

        if (GameStart.gameStart == 1)
        {
            shotTime -= Time.deltaTime;
            if (shotTime <= 0)
            {
                shot = true;
            }
            if (shot)
            {
                Shot();
                shot = false;
                shotTime = 0.05f;
            }

            specialShotTime -= Time.deltaTime;
            if (specialShotTime <= 0)
            {
                specialShot = true;
            }
            if (specialShot)
            {
                SpecialShot();
                specialShot = false;
                specialShotTime = 1;
            }
            move -= Time.deltaTime;
            if (move <= 0)
            {
                movePoint = Random.Range(0, 4);
                move = 5;
            }
            if (gameObject.transform.position.y >= 30)
            {
                escapeSky = -transform.up * speed;
            }
            else
            {
                escapeSky = Vector3.zero;
            }
            if (gameObject.transform.position.y >= 29)
            {
                downLimit -= Time.deltaTime;
                if (downLimit <= 0)
                {
                    down = -transform.up * speed;
                }
            }
            if (gameObject.transform.position.y <= 0)
            {
                Debug.Log("a");
                down = Vector3.zero;
                downLimit = 5;
            }
            capriciousDown -= Time.deltaTime;
            if (capriciousDown <= 0)
            {
                switch (Random.Range(0, 15))
                {
                    case 0:
                        capricious = -transform.up * speed;
                        break;
                    case 1:
                        capricious = transform.up * speed;
                        break;
                    default:
                        capricious = Vector3.zero;
                        break;
                }
                capriciousDown = 1;
            }
            if (Life <= 0)
            {
                Destroy(gameObject);
            }
        }
    }

    private void FixedUpdate()
    {
        if (GameStart.gameStart == 1)
        {
            rb.velocity = EnemyMove(movePoint) + escapeSky + down + capricious;
        }

    }




}


このように。これは良い事なのでしょうか。何かとても悪い事のように考えてしまって、色々調べてみたのですが「ネストが深いのは良くない」とか、「スパゲティ死すべし」等書いてあっただけでして・・・・善悪だけでも構いません、教えていただけないでしょうか。

よろしくお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+16

無駄なフラグが多い

            if (shotTime <= 0)
            {
                shot = true;
            }
            if (shot)
            {
                Shot();
                shot = false;
                shotTime = 0.05f;
            }

↓ やっていることはこれと同じ

            if (shotTime <= 0)
            {
                Shot();
                shot = false;
                shotTime = 0.05f;
            }

これも同様。

            if (shotTime <= 0)
            {
                shot = true;
            }
            if (shot)
            {
                Shot();
                shot = false;
                shotTime = 0.05f;
            }
        if (GameStart.gameStart == 1)
        {
            // 処理①
        }

↓早期リターンする

        if (GameStart.gameStart != 1)
        {
            return;
        }

        // 処理①

これだけでも、入れ子も浅くなるし、余計な条件式もいらなくなりますね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+4

一つのクラスに対していろんな機能をもたせてそれをすべてUpdate内でやろうとするとif文が必然的に多くなってしまいます

一つの機能に対して一つのクラス(いわゆる単一責任の原則)をやってみるといいかもしれません。
特にUnityはコンポーネント指向なのでいろんなコンポーネント(クラス)を作ってGameObjectにアタッチしまくって一つの動作・動きになるっていう形が望ましいです

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

一つのところにいろいろ集中しすぎて、責任の分割とかがやれていない感じですね。
最近読んだ記事で、これが良かったです。
https://qiita.com/_-_-_-_-_/items/1f604f6205b8bfd8a823

あと、早期リターンをやりましょう。
https://blog.isyumi.net/entry/2017/10/11/134948

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C#

    9211questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity

    5635questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。