そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】newってなに?? newが必要なシチュエーションまとめ

環境

Unity 2019.3.7f1

はじめに

ネットでコードを検索していると new がついているコードありますよね??
今回は、
 ・newとは何か?
 ・newが必要なシチュエーション
を私がわかっている範囲でまとめておきます。

newとは何か?

まずnewですが、
インスタンスを作る演算子
です。

new 型名();

でその型名のインスタンスを作成することができます。

設計図の状態から実体を持たせるらしいです。(雰囲気しかわかってない)

newが必要なシチュエーション

今私が把握しているのは次の4つです。
・空のゲームオブジェクトを作るとき
・自分で作ったクラスを使うとき
・配列を使うとき
・構造体(Vector3やVector2など)を使うとき

※もとから作られているC#のクラスはnewでインスタンス化できないらしい

コード例

・空のゲームオブジェクトを作るとき

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

public class test : MonoBehaviour
{
    void Start()
    {
        new GameObject();//空のオブジェクト作成 括弧内に文字列を入れることでオブジェクトの名前を指定できる
    }
}


・自分で作ったクラスを使うとき

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

//ABCという名前のクラス作成
public class ABC
{    
    //関数作成
    public void Moji()
    {
        Debug.Log("newって難しい");
    }
}


public class test : MonoBehaviour
{
    ABC a;//作成したクラスABC型の変数aを宣言

    void Start()
    {
        a = new ABC();//変数aにABCクラスのインスタンスを作成
        a.Moji();//ABCクラスのMoji()関数を実行
    }
}


・配列を使うとき

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

public class test : MonoBehaviour
{
    private int[] a;//int型の配列を変数aで宣言

    void Start()
    {
        a = new int[3];//配列を作りint型の配列変数aに入れる

        //配列 a[0]=0, a[1]=1, a[2]=2 にする
        for (int i = 0; i < 3; i++)
        {
            a[i] = i;
            Debug.Log("a[" + i + "]=" + a[i]);
        }
    }    
}




・構造体(Vector3やVector2など)を使うとき

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


public class test : MonoBehaviour
{    
    void Start()
    {
        //このスクリプトがアタッチされたオブジェクトの位置を(1,2,3)へ変更
        transform.position = new Vector3(1, 2, 3);
    }    
}

 

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


public class test : MonoBehaviour
{    
    void Start()
    {
        //このスクリプトがアタッチされたオブジェクトの位置を(10,20,0)へ変更
        transform.position = new Vector2(10, 20);
    }    
}


おわりに

空のゲームオブジェクトを作ることは実際やらないと思うので、

・自分で作ったクラスを使うとき
・配列を使うとき
・構造体(Vector3やVector2など)を使うとき

の3パターンの場合、newするってのを覚えておけば開発に問題無いと思ってる私です。
そのうち深く理解できることを信じて今日も開発!!

【Unity】クラスや関数の名前の先頭は大文字な件→アッパーキャメルケース

はじめに

クラス名や関数名の名前の付け方は、
プログラミング界隈では一般常識があるようです。

個人制作では関係無いですが、頭の片隅にでも入れておきましょう。

結論

クラスや関数の名前は
複合語の先頭を、大文字で書き始める
アッパーキャメルケース
で書くのが一般的なようです。

例)
PushButton
GetNumber

書き方の種類

image.png

おわりに

私がこの内容を知るまでは、
単語の頭を大文字にしてアンダースコアで区切ってました。
(個人開発なので好きに名前つけ放題)

Unityのクラス名は大文字から始まるので
知っていて損はしない知識だなと感じました。

単語の最初は大文字で書く!!
これをやり始めてから、なんちゃってエンジニア気分で開発してます笑

【Unity】引数を使ったボタンで好きな数字をテキストに表示する

環境

Unity 2019.3.7f1

はじめに

同じような処理のボタンが複数ある場合、 引数を使ったボタンでコードを簡略化できます。

こちらは一つの関数で処理しています。

方法

1.ボタンに割り当てる関数で引数を宣言する。
2.ボタン側で引数の入力値を設定

具体例

1~9の引数をそれぞれ設定したボタンを作成し、
ボタンを押すとテキストに
設定した数値が表示されるようにしてみましょう。

1.前準備
・ボタンを9つ作成
marumaro7.hatenablog.com で作ったボタン群を使います。
(内容:ボタン並べただけ)
image.png

・空のオブジェクトを作成
・新規スクリプト作成
・空のオブジェクトに作成したスクリプトを割り当てる

・テキストを作成
  テキストは、見やすくするためこのように設定
 ・フォントサイズ50
 ・水平オーバーフロー Overflor
 ・垂直オーバーフロー Overflor
image.png


2.ボタンのテキスト変更
ボタンのテキストを1~9に変更。
テキストフォントサイズを50にする。
image.png


3.ボタンに割り当てる関数を作成
このようにコードを書きます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを使うため追加

public class test : MonoBehaviour
{
    [SerializeField] private Text suuji_text;//Text型の変数suuji_textを宣言

    void Start()
    {        
    }

    //ボタンを押したら実行する関数 実行するためにはボタンへ関数登録が必要
    //int型の引数numberを宣言
    public void Push_Button(int number)
    {
        suuji_text.text =""+ number;//suuji_textに引数の数値を代入
    }
}


4.ボタンに関数割り当て
ボタンのクリック時のところに空のオブジェクトを割り当て image.png
先程作成した関数を選択
image.png


数値入力欄が出現するので、
ここにボタンテキストに対応した数値を入力
image.png
それぞれのボタンで関数割り当て&数値入力を行ってください。

5.空のオブジェクトのスクリプトに前準備で作成したテキストをアタッチ
image.png

実行

おわりに

引数を使った関数でコードスッキリ!!

【Unity】オブジェクトを等間隔で配置する方法 Grid Layout Group

環境

Unity 2019.3.7f1

はじめに

ボタンなどを等間隔で配置する方法です。
image.png

方法

1.整列させたいオブジェクト群をPanelオブジェクトに入れる
2.そのPanelオブジェクトにGrid Layout Group(グリッドレイアウトグループ)コンポーネントを追加
3.各種設定行う

具体例

実際にやってみましょう。

前準備
まずボタンを9つ作成します。
image.png

1.整列させたいオブジェクト群をPanelオブジェクトに入れる
パネルオブジェクト作成
image.png


今回Panelに色は不要なので透過を0にして透明にしておきます。
image.png


パネルの配下にボタンを入れる
image.png

2.PanelオブジェクトにGrid Layout Group(グリッドレイアウトグループ)コンポーネントを追加
Panelを選択
コンポーネントを追加
image.png

グリッドレイアウトグループを選択
image.png

3.各種設定行う
ボタンのサイズやセルの間隔などが調整できます。
今回はこのように設定しました。
image.png

できあがり!
image.png

おわりに

これで手作業での等間隔調整とはおさらばです!

【Unity】テキストのONとOFFを交互に切り替えるボタンを作る

環境

Unity 2019.3.7f1

はじめに

ONとOFFが交互に切り替わるボタン作りたいそこのあなた!
今から作ります!

実装までのステップ

全6ステップです。
1.ボタンを作成
2.空のゲームオブジェクトを作成
3.スクリプトを作成
4.空のゲームオブジェクトに作ったスクリプトをアタッチ
5.空のゲームオブジェクトのスクリプトにボタンのテキストをアタッチ
6.ボタンにスクリプトの関数を割り当て

1.ボタンを作成
ボタンを作成したら勝手にCanvasが生成され、その中にボタンが作成されます。
image.png

ボタンのテキストをONに変更しておきます。
image.png

2.空のゲームオブジェクトを作成
image.png

3.スクリプトを作成
新規スクリプトを作成しスクリプトの名前は適当にtestとつけます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//UIを使うため追加

public class test : MonoBehaviour
{
    [SerializeField] private Text on_off_text;//ボタンのテキストをアタッチ
    private bool on_off_button_bool;//bool型の変数on_off_button_boolを宣言


    void Start()
    {
        on_off_button_bool = true;//初期設定
    }

    //ボタンを押したら実行する関数 実行するためにはボタンへ関数登録が必要
    public void Push_Button_Change()
    {
        on_off_button_bool = !on_off_button_bool;// !で反対の意味にするtrueならfalse 、falseであらばtrueになる。

        //on_off_button_boolがtrueだったら処理
        if (on_off_button_bool == true)
        {
            on_off_text.text = "ON";//テキスト変更
        }

        //on_off_button_boolがtrueではないなら処理
        else
        {
            on_off_text.text = "OFF";//テキスト変更
        }
    }
}


4.空のゲームオブジェクトに作ったスクリプトをアタッチ
image.png

5.空のゲームオブジェクトのスクリプトにボタンのテキストをアタッチ
image.png

6.ボタンにスクリプトの関数を割り当て
ボタンオブジェクトのインスペクターのButtonコンポーネントで関数を割り当て
image.png

実行結果
ボタンを押すたびにテキストがONとOFFに切り替わります。

おわりに

今回は作業内容だけとしておきます。
もっと簡単にできる方法があると思うので教えてください。

【Unity】スクリプトからゲームオブジェクトの表示・非表示を判定する

環境

Unity 2019.3.7f1

はじめに

スクリプトからゲームオブジェクトの表示・非表示を判定する方法を説明します。

コード

表示・非表示の判定は
ゲームオブジェクト型の変数.activeSelf
で取得できます。

この関数はbool型の返り値を返すので
bool型の変数=ゲームオブジェクト型の変数.activeSelf;
で使います。

具体例

下記のコードで非表示にしたオブジェクトをアタッチして実行してみます。

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

public class test : MonoBehaviour
{
    [SerializeField] private GameObject a;//GameObject型の変数aを宣言 好きなゲームオブジェクトをアタッチ
    private bool b;//bool型の変数bを宣言
    
    void Start()
    {
        b = a.activeSelf;//aがアクティブかどうか判定し、trueかfalseがbに入る
        Debug.Log("b=" + b);//コンソールに変部bの中身を表示
    }
}


結果
変数aにアタッチされていたオブジェクトは非表示だったので変数bの中にはfalseが入っています。
image.png

おわりに

判定した返り値をbool型の変数に入れるのを忘れずに!

【Unity】スクリプトからのオブジェクト表示・非表示、見かけ上の表示・非表示

環境

Unity 2019.3.7f1

はじめに

今回はオブジェクトにおける
・表示、非表示
・見かけ上の表示、非表示
について書きます。

見かけ上の非表示というのは
実体はあるけど透明になってしまって見えないという意味です。


コード

・オブジェクト表示
GameObject型の変数.SetActive(true);

・オブジェクト非表示
GameObject型の変数.SetActive(false);

・オブジェクトを見かけ上表示
Renderer型の変数.enabled = true;

・オブジェクトを見かけ上非表示
Renderer型の変数.enabled = false;

具体例

・オブジェクト表示

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

public class test : MonoBehaviour
{
    [SerializeField] private GameObject a;//GameObject型の変数aを宣言 好きなゲームオブジェクトをアタッチ
 
    void Start()
    {
        a.SetActive(true);
    }
}


・オブジェクト非表示

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

public class test : MonoBehaviour
{
    [SerializeField] private GameObject a;//GameObject型の変数aを宣言 好きなゲームオブジェクトをアタッチ
 
    void Start()
    {
        a.SetActive(false);
    }
}


・オブジェクトを見かけ上表示

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

public class test : MonoBehaviour
{
    [SerializeField] private Renderer a;//Renderer型の変数aを宣言 好きなゲームオブジェクトをアタッチ
   
    void Start()
    {
        a.enabled = true;
    }
}


・オブジェクトを見かけ上非表示

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

public class test : MonoBehaviour
{
    [SerializeField] private Renderer a;//Renderer型の変数aを宣言 好きなゲームオブジェクトをアタッチ
   
    void Start()
    {
        a.enabled = true;
    }
}

おわりに

これで表示非表示はばっちり。