20201025のUnityに関する記事は7件です。

ScrollViewでViewPort外側のGameObjectが非表示にならない

Contentの中に入れているGameObjectのInspectorを確認。maskableにチェックが外れていたら、入れる

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

【Unity】Fungusでゲーム制作(8) 制限時間付きの選択肢・QTEを作る

Fungusの基本的な使い方に関しては第1回の記事で解説しておりますので、まだの方はそちらからお読み下さい。

前回は会話ウィンドウや選択肢のUIを作り変えてみました。
今回は制限時間付きの選択肢やQTE(一定時間内にキーを入力しなくてはならないイベント)といったリアルタイム性のあるイベントを実装していきたいと思います。

制限時間付きの選択肢を作る

Menu Timerコマンドを使うことで選択肢に時間制限を設けることができます。一連のMenuコマンドのどこかに紛れ込ませておけば機能します。
1.png
Duration欄は制限時間の秒数を、Target Block欄には時間切れになった際に飛ぶブロックを指定します。
プレイして確認してみましょう。以下のように選択肢の下に残り時間ゲージが表示され、空になると時間切れ用のブロックに飛びます。
2.png

QTEを作る

今回は一定時間内に指定されたキーを1回入力することで展開が分岐する、という単純なQTEを作ってみたいと思います。

先にQTE用のUIを作っておきます。Unity全体のメニューから「GameObject」→「UI」→「Text」を選択するとテキストのUIを生成できます。それを選択してInspectorビューに移り、Rect Transformコンポーネントで位置を、Textコンポーネントでフォントの種類やサイズを調整してください。
押すキーを示すテキストと、残り時間を示すテキストの2つを作っておきます。
またこのまま表示すると見えにくいので、半透明の背景もつけておきます。「GameObject」→「UI」→「Panel」と選択してパネルを作り、やはり大きさを調節し、先ほどのテキスト2つをその下に入れます。
だいたい下図のようになるのではないかと思います。ゲーム開始直後から表示されていては困るので、パネルを非アクティブ化して隠しておいてください。
3.png
さて中身の実装に移りたいと思います。まず、今回作るQTEがどのような仕組みで動くのかを考えてみましょう。QTEは「制限時間以内に、画面に表示されたキーを入力させるイベント」です。これを分解するような形で必要なパーツを考えてみると、以下のようになります。

  • 時間制限の仕組み
    • 残り時間を保持する変数
    • 残り時間変数を継続的に減らす仕組み
    • 残り時間変数が0になった時に時間切れ用の処理に飛ぶ仕組み
  • キーの入力を常に受け付け、入力が成功したら成功用の処理に飛ぶ仕組み
  • 入力すベきキー(と残り時間)を画面に表示する仕組み

1つずつ考えていってみましょう。残り時間を保持する変数は普通に作ってSet Variablesで値を入れればよいですね。変数を継続的に減らすにはループが使えます(Loop RangeでもWhileでもOK)。ただし普通にループするだけだと一瞬で残り時間が0になってしまうので、短いウェイトを入れます。そして残り時間が0になったらループを抜けて、時間切れ用の処理に飛べばよいでしょう。
キーの入力受け付けもループの中で行います。これはGetKeyコマンドを使います。
5.png
Key Code欄で受け付けたいキーの種類を選択します。種類が多いのですが見ればだいたい分かるかと思います。今回は↑キー(Up Arrow)を指定してみます。Key Query Type欄は今回はDownに指定してください。初期値のStateのままだと指定されたキーを押しっぱなしにしてQTEに突入したときにもクリア扱いになってしまいます。Out Value欄は受け付けた結果を入れるInteger型の変数を指定します。受け付けた場合は1が入ります。

最後に入力すべきキーと残り時間の表示ですが、これはSet Activeコマンドで先ほどのテキストを乗せたパネルをアクティブにし、Set Textコマンドで中身を書き換えればOKですね。ループの外側で入力すべきキーを、内側で残り時間を書き換えます。

方針がまとまったので、実際に組んでみましょう。下図のようになるかと思います。
6.png
起動してQTEが機能しているのを確かめてみましょう。
7.png
今回は制限時間付きの選択肢や、QTEといったリアルタイム性のあるイベントの作り方について取り扱いました。
次回はセリフや指示を並べたテキストから会話イベントを展開してくれるConversationコマンドについて解説する予定です。

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

【エディタ拡張】ProjectWindowのフォルダ開閉状態をリセットするエディタ拡張

概要

開きまくっていたプロジェクトウィンドウ上のフォルダ開閉状態をいったんリセットしたい場合に有効なエディタ拡張です。

使い方

ProjectCollapse.gif

  • Window/ProjectBrowserHelperで開きます。
  • Collapse All

※TwoColumnレイアウトだと動作が完全ではなく、全部閉じるではなく、
現在のフォルダ以下のものだけが閉じられる挙動になっております。

環境

  • Unity2019.4.13f1~

コード

Gistにもアップしました。

ProjectBrowserHelperWindow.cs
using System.Linq;
using System.Reflection;
using UnityEditor;
using UnityEngine;
using UnityEngine.UIElements;

public class ProjectBrowserHelperWindow : EditorWindow
{
    [MenuItem("Window/ProjectBrowserHelper")]
    static void Init()
    {
        GetWindow<ProjectBrowserHelperWindow>();
    }

    void OnEnable()
    {
        var collapseAllButton = new Button(() => OnClickCollapseAll());
        collapseAllButton.text = "Collapse All";
        rootVisualElement.Add(collapseAllButton);
    }

    void OnClickCollapseAll()
    {
        Selection.activeObject = null;
        var window =
        Resources.FindObjectsOfTypeAll<EditorWindow>().FirstOrDefault(x => x.GetType().Name == "ProjectBrowser");
        if (window == null) { return; }

        new InternalProjectBrowser(window).ClearExpandedIDs();
        window.Repaint();
    }

    /// <summary>
    /// UnityEditor.ProjectBrowserのリフレクション
    /// </summary>
    class InternalProjectBrowser
    {
        SerializedObject so;

        SerializedProperty AssetTreeExpandedIDsProperty => so.FindProperty("m_AssetTreeState.m_ExpandedIDs");
        SerializedProperty FolderTreeExpandedIDsProperty => so.FindProperty("m_FolderTreeState.m_ExpandedIDs");

        public InternalProjectBrowser(EditorWindow ProjectWindow)
        {
            so = new SerializedObject(ProjectWindow);
        }

        public void ClearExpandedIDs()
        {
            so.Update();
            AssetTreeExpandedIDsProperty.ClearArray();
            FolderTreeExpandedIDsProperty.ClearArray();
            AssetTreeExpandedIDsProperty.arraySize = 0;
            FolderTreeExpandedIDsProperty.arraySize = 0;
            so.ApplyModifiedProperties();
            Reload();
        }

        void Reload()
        {
            var methodInfo = so.targetObject.GetType().GetMethod("ResetViews", BindingFlags.Instance | BindingFlags.NonPublic);
            methodInfo.Invoke(so.targetObject, new object[0]);
        }
    }
}

まとめ

フォルダの開閉状態を一気に閉じたい場合、便利かと思います。

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

Unity「Add Script Component "****"…」が表示されC#スクリプトがアタッチできない

Unitでオブジェクトに作りたてのC#Scriptをアタッチすると
Can't Add Script - Add Script Component "***"
と表示されてアタッチできない事がある

いくつか要因があるようで、まとめる。
※関係ないものもあるかもしれませんがご容赦を。
 私の場合はおそらく3,4,5,6,7が原因でした

1.ファイル名とクラス名が異なる場合
 ファイル名がTestの場合、クラス名もTestにする必要がある。(ファイルをリネームした場合クラス名に反映されない。逆もしかり)
 <参考資料>
 https://freesworder.net/unity-cant-add-script/

2.Unity Hubのバグ
 <参考資料>
 https://teratail.com/questions/229361

3.Visual Studio に「Unityによるゲーム開発」
 がインストールされていない
 <参考資料>
 http://www.code-magagine.com/?p=3854

4.Visual Studioが最新バージョンでない
 <参考資料>
 http://www.code-magagine.com/?p=3854

5.デバッガ(Visual Studio)がUnityにアタッチされていない
 下記手順で解決することがある
 ①スクリプトをダブルクリックし、Visual Studioを起動
 ②メニューバー→デバッガ→Unityデバッガのアタッチを選択
 ③ウィンドウが開くので該当するUnityのインスタンスを選択
 <参考資料>
 http://www.code-magagine.com/?p=3854

6.Standard Assetsをインポートしている場合
 Visual Studioでビルドすると「GUITextが旧形式です」と表示される場合はこれに該当する
 SimpleActivatorMenu.cs内に
 using UnityEngine.UI;を追加
 GUIText→Textに書き換える
 <参考資料>
 https://connect.unity.com/p/standard-assets-guitexture-and-guitext-are-obsolete

7.上記を実施した上で再起動
 最後はUnityとVIsual Studioを再起動したところでビルドが通り解決しました

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

相談です。いつも入門者から初心者へレベルアップできません。

これまで色んなプログラミング言語を独学で勉強してきたけど、
どれも入門書レベルまででそれ以上の技術を身に着けることができず挫折してしまいます。
検索の仕方が足りないかもしれませんが、ネットや書籍に多いのは
入門者向け、中級者以上向け(入門者じゃほぼ理解できない)が多いのかなと思います。

現在はC#を使うUnityを勉強中です。

自分と同じ気持ちの入門生さんや、
何かアドバイスがある方コメントください。

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

地面でボールがバウンドした回数を表示する

バウンド例.gif

動画はこちら
https://youtu.be/8T7Gy67bL6w

地面に下記スクリプトがアタッチされます。

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

public class count : MonoBehaviour
{
    //===== 変数定義エリア start =====
    private int boundCount;
    public Text boundCountText;
    //===== 変数定義エリア end =====

    //===== 初期処理 start =====
    void Start()
    {

    }
    //===== 初期処理 end =====

    //===== 主処理 start =====
    void Update()
    {

    }
    //===== 主処理 end =====

    //===== ボールがぶつかったときに加算される処理 =====
    private void OnCollisionEnter(Collision collision)
    {
        boundCount++;
        boundCountText.text = boundCount.ToString();
    }
}

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

【Unity C#】Color32はstruct!!|すずとも初耳学#1

すずとも初耳学とは

すずともが、プログラミングをするにあたって

  • 知らなかったこと
  • これ便利だなぁーって思ったこと
  • 覚えておきたいこと

などを、「すずとも初耳学」としていろいろ記事書けたらな―と思います。

Color32 は Struct!

#1として取り上げるのは、Unityにある「Color32」という型。

UnityEngine.Color32 - Unity スクリプトリファレンス

最近Textureなどを触る機会があって、少し気になったので調べてみたのですが、

Color32型はStruct!
image.png

はい。それだけです笑

Structだから何って?

C#で構造体を扱おうと思うと、StructとClassがあります。
書き方も似てるしできることも似てるので、初心者は「あれ?同じじゃね?」と思いがちです。(少なくとも僕は)

しかし、StructとClassには明確な違いがあります。それは、

  • Structは値渡し
  • Classは参照渡し

という点です。いやぁこれ結構重要だし、知らなかったら混乱するよね…

Unityでよく使うものを分けてみるとこんな感じ。

  • Struct
    • int型、float型などよく使う基本型
    • Color32
    • Vector2、Vector3
  • Class
    • gameobject
    • transform
    • texture

intとかは何気なく代入してるけど、Structだったからできたのか!
gameobjectのtransformとか参照渡しだから変数で持ってこれたのか!

などなど、個人的には大発見(o^―^o)

というわけで、「Color32はStruct!」w

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