20200405のUnityに関する記事は9件です。

Unityのスクリプトのあれこれ

概要

Unityのスクリプトで使う関数を毎回調べてしまうため、よく使うものをまとめておく。
(随時追加予定)

C#関数

配列内をランダムに取得する

string[] words = new string[3] {"a","b","c"};

Debug.Log(words[Random.Range(0, words.Length)]);

// b(出力はランダムに変化)

ゲームオブジェクトの設定

Prefabをゲームオブジェクトに設定する

あらかじめ、Assetsフォルダ内に「Resources」フォルダを作成し、その中にPrefabをおく。
(以下の例ではResourcesフォルダ内にPrefabsフォルダを作り、その中にobj1というprefabを置いている。)

GameObject obj = new GameObject();

obj = (GameObject)Resources.Load("Prefabs/obj1")
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityのスクリプト関数まとめ

概要

Unityのスクリプトでよく使う関数をまとめておく。
(随時追加予定)

C#関数

配列内をランダムに取得する

string[] words = new string[3] {"a","b","c"};

Debug.Log(words[Random.Range(0, words.Length)]);

// b(出力はランダムに変化)

ゲームオブジェクトの設定

オブジェクトを生成する

// 引数(ゲームオブジェクト, 位置, 回転)
Instantiate(gameObj, Vector3.zero, Quaternion.identity);

親オブジェクトを設定(子オブジェクトとして生成する)

[SerializeField] private GameObject parentObj; // 親オブジェクト

// 子オブジェクトを生成して親オブジェクトの設定する
GameObject childObj = Instantiate(obj, Vector3.zero, Quaternion.identity);
childObj.transform.parent = parentObj.transform;

Prefabをゲームオブジェクトに設定する

あらかじめ、Assetsフォルダ内に「Resources」フォルダを作成し、その中にPrefabをおく。
(以下の例ではResourcesフォルダ内にPrefabsフォルダを作り、その中にobj1というprefabを置いている。)

GameObject obj = new GameObject();

obj = (GameObject)Resources.Load("Prefabs/obj1")

2D画像の設定(Sprite)

以下の例ではinspectorウインドウでSprite画像を設定し、ゲームオブジェクトに設定

[SerializeField] private Sprite sprite_image;

gameObj.GetComponent<SpriteRenderer>().sprite = sprite_image;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityのスクリプトまとめ

概要

Unityのスクリプトでよく使う関数をまとめておく。
(随時追加予定)

C#関数

✨連想配列

Dictionary(Key, Value)の形で値を保持する。以下は宣言と初期化。

// 初期化①
Dictionary<string, int> fruits = new Dictionary<string, int>()
{
    ["apple"] = 100,
    ["mikan"] = 120
};

// 初期化②
Dictionary<string, int> Player = new Dictionary<string, int>()
{
    { "player", 100 },
    { "enemy", 200 }
};

✨切り上げ・切り捨て・四捨五入

切り上げ(正の無限大に向かう)

float num1 = 1.15f;
float num2 = -1.25f;

Debug.Log(Mathf.Ceil(num1)); // 2
Debug.Log(Mathf.Ceil(num2)); // -1

切り捨て

using System; // Math使用時は必要

float num1 = 1.15f;
float num2 = -1.25f;

// ①負の無限大に向かう
Debug.Log(Mathf.Floor(num1)); // 1
Debug.Log(Mathf.Floor(num2)); // -2

// ②0に向かう
Debug.Log(Math.Truncate(num1)); // 1
Debug.Log(Math.Truncate(num2)); // -1

四捨五入

using System; // Math使用時は必要

float num1 = 1.5f;
float num2 = 2.5f;
float num3 = -1.5f;
float num4 = -2.5f;
float num5 = 1.25f;

// ①偶数への丸め込み(切り上げの場合は一番近い偶数になる)
Debug.Log(Mathf.Round(num1)); // 2
Debug.Log(Mathf.Round(num2)); // 2
Debug.Log(Mathf.Round(num3)); // -2
Debug.Log(Mathf.Round(num4)); // -2
Debug.Log(Mathf.Round(num5)); // 1

// ②通常の四捨五入
Debug.Log(Math.Round(num1, MidpointRounding.AwayFromZero)); // 2
Debug.Log(Math.Round(num2, MidpointRounding.AwayFromZero)); // 3
Debug.Log(Math.Round(num3, MidpointRounding.AwayFromZero)); // -2
Debug.Log(Math.Round(num4, MidpointRounding.AwayFromZero)); // -3
Debug.Log(Math.Round(num5, MidpointRounding.AwayFromZero)); // 1

// ③桁数指定 (第2引数に得たい小数の桁数を指定)
Debug.Log(Math.Round(num5, 1, MidpointRounding.AwayFromZero)); // 1.3

✨配列内をランダムに取得する

string[] words = new string[3] {"a","b","c"};

Debug.Log(words[Random.Range(0, words.Length)]);

// b(出力はランダムに変化)

✨文字列をint型へ変換する

using System;

int num = Int32.Parse("123");

ゲームオブジェクトの設定

✨オブジェクトを生成する

// 引数(ゲームオブジェクト, 位置, 回転)
Instantiate(gameObj, Vector3.zero, Quaternion.identity);

✨親オブジェクトを設定(子オブジェクトとして生成する)

以下の例ではinspectorウインドウで親オブジェクトをあらかじめ設定

[SerializeField] private GameObject parentObj; // 親オブジェクト

// 子オブジェクトを生成して親オブジェクトの設定する
GameObject childObj = Instantiate(obj, Vector3.zero, Quaternion.identity);
childObj.transform.parent = parentObj.transform;

✨オブジェクト名に[Clone]がつかないようにする

ゲームオブジェクト生成時、オブジェクト名に[Clone]がつく。これをつかないようにする。

GameObject obj = Instantiate(gameObj, Vector3.zero, Quaternion.identity);
obj.name = gameObj.name;

✨プロパティをInspector上からオブジェクトを設定できるようにする

[SerializeField] private GameObject player;
// または
public Text text;

[SerializeField]とした場合、Unityエディタで[CS0649警告]が表示される。
これが邪魔な場合はデフォルトを設定するのが一案としてある。

[SerializeField] private GameObject player = default;

✨Prefabをゲームオブジェクトに設定する

あらかじめ、Assetsフォルダ内に「Resources」フォルダを作成し、その中にPrefabをおく。
(以下の例ではResourcesフォルダ内にPrefabsフォルダを作り、その中にobj1というprefabを置いている。)

GameObject obj = new GameObject();

obj = (GameObject)Resources.Load("Prefabs/obj1")

✨2D画像の設定(Sprite)

以下の例ではinspectorウインドウでSprite画像を設定し、ゲームオブジェクトに設定

[SerializeField] private Sprite sprite_image;

gameObj.GetComponent<SpriteRenderer>().sprite = sprite_image;

UIの設定

✨クリックイベントに引数を設定する

// 単純に引数を記述する、あとはInspectorウインドウで設定する
public void onClickButton(GameObject obj)
{
    // 処理を記述
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity初心者】チュートリアルを終えた人が知るべきこと3つ

対象の方

なんらかのUnityチュートリアルを終えて制作の雰囲気がわかっている方

知るべきこと3つ

他の記事を見る際に以下の点に注意して読むと内容が分かりやすくなるはずです。
次の3つが私がUnityを学ぶうえで、徐々につかんでいった内容になります。

1.変数宣言の型にはUnity独自のものがある
変数宣言の型といったらint、float、stringを最初に学習すると思います。
Unityでは、それらも使用しますが、
Unity上で登場する次のものも宣言する必要があります。
image.png
型の種類はまだまだあります。
変数宣言の型にはUnity独自のものがたくさんあることを覚えておくだけでOKです。

2.メソッドには2種類ある

・C#やUnity側であらかじめ用意されているメソッド
・自分で処理内容を定義するメソッド

私は最初、全部のメソッドは用意されたものがあると思っていました。
メソッドは作れる!!

あらかじめ用意されているメソッドは今後紹介していきます。

 

3.初期スクリプトの中身
初期スクリプト全体 & それぞれざっくりの説明
image.png

①名前空間
 必要な時に随時追加する必要があります。
 詳しくは「れー@DKRevel」さんの記事を参考にして下さい。
 https://dkrevel.com/makegame-beginner/namespace

②クラス宣言
 スクリプトの名前が「TEST_script」ってことがわかればOK

③スタート関数
 「変数の初期値」、「初回に一度きりの処理」を書きます。

④アップデート関数
 連続的な処理を書きます。
 1フレームの時間間隔はPCごとに変わるようです。
 (一定の秒数などで処理したい時は、Time.deltatimeでフレーム間の時間を取得する。 詳細割愛)

以上、私が最初に教えてほしかった内容でしたー。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【爆速メモ】windowメニューからpackage managerが消えた時

windowメニューからpackage managerが消えた時、
1. 新規でプロジェクトを作成する
2. 新しく作成されたプロジェクト内の[Packages]フォルダのmanifest.jsonファイル内のテキストをコピーする
3. package managerが消えたプロジェクトのmanifest.jsonファイルにペーストする

もろもろバックアップは念のためとっておきましょう。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Qiita書き方の初歩 タイトル、コードの書き方 画像の貼り方

記事作成における初歩的な内容をメモ
・タイトル書き方
・コードの書き方
・画像の貼り方
・細かい設定は公式を参照

タイトルの書き方

タイトルは先頭に#を付ける
例)#タイトルの書き方

コードの書き方

1.コードの範囲指定
  コードの始まり:「Shift+@」で入力できる記号(記号の名前わかりません汗)を3回入力
  コードの終わり:同じく「Shift+@」で入力できる記号を3回入力
 ↓こんな感じ
image.png

2.コード入力 
この記号の中にコードを入力すると
image.png
 ↓このように表示されます

   private float red;

3.言語の指定
言語がC#の場合、「Csharp」を次のように記述すると
image.png
↓色がついて表示されます

   private float red;

4.スクリプト名称の入力
名前を入れたい場合「:」コロンを入力したあと名称を入力
:testを付け足してみると
image.png
↓左上に名称が表示されます。

test
   private float red;

画像の貼り方

貼り方は2種類
①貼りたい画像を記事内にドラック&ドロップ

②記事右上の画像ボタンをクリック
image.png

細かい設定は公式を参照

↓リンクはこちら
https://qiita.com/Qiita/items/c686397e4a0f4f11683d

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GitLab で Unity の Android アプリを自動ビルドするようにしてみた

GitLab で Unity の Android アプリを自動ビルドするようにしてみた

GitLab で Unity の Androidアプリを自動ビルドするようにしてみました。
最初は、Windows10 で試行錯誤していましたが、GitLab Runner の実行ユーザーがシステムアカウントになるためか、エラーが解消されませんでした。
Mac で試したところ問題なく動いたので、Mac を使うほうがよさそうです。

環境

  • macOS Catalina 10.15.4
  • GitLab CE 12.8.6(Windows10上の仮想サーバーで動かしています)
  • GitLab Runner 12.9.0(Mac上で動かしています)
  • Unity 2018.4.20f1

フォルダ構成

ファイル/フォルダ 内容
TestProject_Unity/ Unityプロジェクトフォルダ
TestProject_Unity/.gitignore Git無視リストファイル
TestAutoTest/TestProject_Unity/Assets/Editor/AppBuild.cs ビルド実行メソッドC#ファイル
.gitlab-ci.yml GitLab CI 設定ファイル
build.sh ビルド用シェルスクリプトファイル
README.md 説明ファイル

注意点

Android SDK をインストールしたフォルダに toolsフォルダが入っていないことがあるようです。

Image Pasted at 2020-4-5 09-43.png

toolsフォルダが見当たらないときは、Android Studio から SDKManager を起動して、Android SDK Platform-Tools をインストールしてみてください。

Image Pasted at 2020-4-5 09-43_2.png

ファイルの内容

TestProject_Unity/.gitignore

/[Ll]ibrary/
/[Tt]emp/
/[Oo]bj/
/[Bb]uild/
/[Bb]uilds/
/Assets/AssetStoreTools*

# Autogenerated VS/MD solution and project files
ExportedObj/
*.csproj
*.unityproj
*.sln
*.suo
*.tmp
*.user
*.userprefs
*.pidb
*.booproj
*.svd

# Unity3D generated meta files
*.pidb.meta

# Unity3D Generated File On Crash Reports
sysinfo.txt

# Builds
*.apk
*.unitypackage

# Visual Studio
.vs
Release/
Debug/

.gitlab-ci.yml

stages:
  - build

job_build01:
  stage: build
  script:
    - echo "Start build"
    - chmod a+x ./build.sh
    - ./build.sh Android 1.2.3.4
    - echo "Finish build"
  tags:
    - mac
  artifacts:
    paths:
      - build_*.log
      - TestProject_Unity/Build/
    expire_in: 1 week

TestAutoTest/TestProject_Unity/Assets/Editor/AppBuild.cs

using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;
using System;
using System.Collections.Generic;

public class AppBuild : MonoBehaviour
{
    static string[] GetSceneList()
    {
        List<string> sceneList = new List<string>();
        EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
        foreach (EditorBuildSettingsScene scene in scenes)
        {
            if (scene.enabled)
            {
                sceneList.Add(scene.path);
            }
        }
        return sceneList.ToArray();
    }

    static string GetArgument(string name)
    {
        string[] arguments = Environment.GetCommandLineArgs();
        for (int i = 0; i < arguments.Length; i++)
        {
            if (arguments[i].Contains(name))
            {
                return arguments[i + 1];
            }
        }
        return null;
    }

    public static void Build()
    {
        string locationPathName = "";
        BuildTarget target = BuildTarget.NoTarget;
        string bundleVersion = GetArgument("/version");;
        string platformName = GetArgument("/platform");
        switch (platformName.ToLower())
        {
            case "android":
                {
                    locationPathName = "Build/" + platformName + "_" + bundleVersion + ".apk";
                }
                break;
            default:
                {
                    locationPathName = "Build/" + platformName + "_" + bundleVersion;
                }
                break;
        }
        target = (BuildTarget)Enum.Parse(typeof(BuildTarget), platformName);

        BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
        buildPlayerOptions.scenes = GetSceneList();
        buildPlayerOptions.locationPathName = locationPathName;
        buildPlayerOptions.target = target;
        buildPlayerOptions.options = BuildOptions.Development;

        PlayerSettings.bundleVersion = bundleVersion;

        BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
        BuildSummary summary = report.summary;

        if (summary.result == BuildResult.Succeeded)
        {
            Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
        }

        if (summary.result == BuildResult.Failed)
        {
            Debug.Log("Build failed");
        }
    }
}

build.sh

#!/bin/bash

SHELL_PATH=`pwd`
PLATFORM=$1
VERSION=$2

UNITY=/Applications/Unity/Hub/Editor/2018.4.20f1/Unity.app/Contents/MacOS/Unity
LOGFILE=build_${PLATFORM}.log
PROJECT_PATH=TestProject_Unity
EXECUTE_METHOD=AppBuild.Build

${UNITY} -batchmode -quit -logFile ${LOGFILE} -projectPath "${SHELL_PATH}/${PROJECT_PATH}" -executeMethod ${EXECUTE_METHOD} /platform ${PLATFORM} /version ${VERSION}

まとめ

Unity のビルドはけっこう時間がかかりますね。
開発に専念できるように、自動ビルドする環境を用意してはいかがでしょうか?

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

オブジェクトを複製しよう(Prehub)

前置き

C#なら一度書けば覚えるのに、Unity関係の機能は何度やっても覚えられない……。(-_-)zzz
ゲームのステージ作るのにPrehub使いたいのになあ。( ;∀;)
このブログは何のためにあるのか、それは覚えるのが面倒なもののメモのためだー!(定期)

ここから本編スクリーンショット (226).png

3分Prehubクッキング
1分目 

Prehubにしたいオブジェクトを作りましょう。

2分目 
PrehubにしたいオブジェクトをAsset内にドラック&ドロップしましょう。

3分目 
Prehubにしたいオブジェクトが青くなったのを確認して、お茶を飲みましょう。


大量生産!大量消費!

prehub.cs
using UnityEngine;
//最初にステージを生成する
public class stagecreate : MonoBehaviour
{
    //スクリプトにPrehubをアタッチする
    public GameObject fields;

    void Start()
    {
        //Prehubを作成
        GameObject field = Instantiate(fields) as GameObject;
        //ここで位置情報を入力したり、名前を変えたり、後はお好みで。
    }
}

Instantiate関数ってのを使います。Prehubを生成する関数という認識で大丈夫!('ω')

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

public class Control : MonoBehaviour
{
    void Update()
    {
        //一定範囲内にいないとこのオブジェクトを破壊する
        if(this.transform.position.x > 50)
        {
            Destroy(this.gameObject);
        }
    }
    //何かに当たったら反応
    void OnTriggerStay(Collider other)
    {
        //当たったものが"weapon"だったらこのオブジェクトを破壊
        if (other.gameObject.name == "weapon")
        {
            Destroy(this.gameObject);
        }
    }
}

参考までに作ったPrehubを破壊するオブジェクト。(Prehubである必要は特にない)
Prehubに直接このスクリプトをアタッチすれば動いてくれる。('ω')ノ
たくさんPrehubを破壊する場合はプールという機能を使えばいいらしいけど、勉強不足なので、勉強後にそれについてもメモ書いとこうかなあ(計画倒れになるやつ)

Instantiate関数についてはこれが詳しく書いてくれてます。(*^^)v

オブジェクト生成の仕方 Instantiate
https://qiita.com/Teach/items/c28b4fe5ca8dc4c83e26#prefab%E3%81%AEtransform%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A7%E7%94%9F%E6%88%90%E3%81%99%E3%82%8B%E5%A0%B4%E5%90%88

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

突然 Unityのログファイル (Editor.log) に何も出力されなくなった時の対応

環境

  • macOS(10.15.2)
  • Unity 2018.4.14f1

事象

  • UnityのConsoleウィンドウにはログが垂れ流されている
  • ログファイル(Editor.log)を tail -f しても何も出力されない
    • tail -f ~/Library/Logs/Unity/Editor.log
  • その他エディタで見てもログファイルの内容が変化していない

対応

  • ~/Library/Logs/Unity/Editor.log を削除
  • Unityを再起動

自分はこの方法で直りました。ご参考まで。
削除以外の方法をご存知の方がいましたら教えていただけると嬉しいです。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む