投稿記事

活動報告の記事 (24)

Fi-Mo 2020/07/10 12:00

進捗報告(15) + UI用ボタンのつづき

概要

泡盛もろみです。

今回は
・UIボタンの続き (byミサゴ)
・UIパーツ作成 (by泡盛)
です。

UIボタンの続き

東雲ミサゴです。

今回は、以前の記事で見た目を作成したゲージ付きボタンを動かす流れを紹介します。
ただ本件、長くなることが予想されますので、今週から何度かに分けてご説明します。お付き合いいただければ幸いです。
尚、実際に使用する際は、一連の記事で書く予定のものから変形すると思います(寧ろ既にだいぶ違っています)。
他の機能を追加したくなる事もあるでしょうし、違う書き方にすることで管理が楽になる事もあるでしょうからね!

今回は、「とりあえずゲージが動く」ところまでを考えてみます。

前提

機能を色々付けたくなってしまいますが、それらは後から拡張するものとして、まずは最低限で動かす事を考えます。

  1. スクリプトはボタン本体にアタッチするものとする
  2. 時間の経過に応じてゲージを伸ばし、最大になるとそこで止める
  3. ゲージが最大である時のみ操作を有効とする
  4. ゲージの保持数は1本のみとする
  5. ゲージが100%未満の間はボタン操作を無効にする
  6. ボタン動作時の処理はDebug.Log()とする
    としてみましょう。

大雑把な構造を考える

前提を踏まえて、
1. Startでオブジェクトの取得と変数の初期化する
2. Updateでフレーム毎に最大値までゲージを進行する
3. ボタンが押された場合、ゲージが最大値であれば処理を実行し、ゲージを0にする

という流れで考えたいと思います。

より具体的にすると、
1. Start()内で
 a) オブジェクト、コンポーネントを検索・取得する
 b) 変数を初期化する
2. Update()で
 a) Time.deltaTimeで前回のフレームからの経過時間を取得、加算
 b) FillAmountに反映
3. ButtonOnClickで
 a) FillAmountを減らす
 b) Debug.Logを吐く

……という具合ですね。

インポート

Class内部の編集に入る前に、コード頭の塊に次の1行を追加します。

using UnityEngine.UI;

これがないとUIの操作ができませんからねっ!

変数の宣言

ここからClass内部。続いて変数を宣言します。
オブジェクト用として

// ゲージ本体のオブジェクト
private GameObject GaugeMain;
// ゲージ本体画像
private Image GaugeImage;

数値用として

// チャージ進行時間
private float ChargeAmount;

が必要ですね。

Start()

まずはStart()から。

オブジェクトの取得

// このスクリプトをアタッチしたオブジェクトの子オブジェクトから
// 名前の一致するものを取得
GaugeMain = transform.Find("GaugeMain").gameObject; 

// GaugeMainの中の画像を取得
GaugeImage = GaugeMain.GetComponent<Image>(); 

書籍などでGameObject.Find("OBJECT_NAME")をよく見かけますが、ここではtransform.Find("OBJECT_NAME")としています。
GameObject.Findではヒエラルキーにある全ての(有効な)オブジェクトから検索しますが、最初のものを見つけたところで検索が終わってしまいます。
このボタンが1つしかなければ良いのですが、複数ある場合は同ボタンのどれか一つのGaugeMainが引っかかった時点で、他が無視されてしまう訳ですね。
(最悪の場合、このボタンとは関係ないGaugeMainというオブジェクトを発見…の可能性もあります)
これを回避するため、「このスクリプトがアタッチされているオブジェクト」の「子オブジェクト」を名前で検索しています。
(前提でスクリプトはボタンにアタッチする、と書いているのはここのためで、ここが変わると書き方が変わります)

変数の初期化

// チャージ進行時間の初期化
ChargeAmount = 0.00f;
// ゲージ色の初期化
GaugeImage.color = new Color(0.66f, 0.00f, 0.00f);

ゲージの量を0にするほか、伸ばすゲージの色を初期化しています。
作成時に分かりやすいのでエディタ上でも色を指定しましたが、最終的にこの値を変更する事で見た目を操作する事を目指します。

確認

これらを一度まとめると……

<Charge.cs>
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI; // 追加

public class Charge : MonoBehaviour {

    /** オブジェクト用 **/
    // ゲージ本体オブジェクト
    private GameObject GaugeMain;
    // ゲージ本体画像
    private Image GaugeImage;

    /** 数値用 **/ 
    // チャージ進行時間
    private float ChargeAmount;

    // Start is called before the first frame update
    void Start() {

        /** オブジェクト取得 **/ 
        // このスクリプトをアタッチしたオブジェクトの子オブジェクトから
        // 名前の一致するものを取得
        GaugeMain = transform.Find("GaugeMain").gameObject;
        // GaugeMainの中の画像を取得
        GaugeImage = GaugeMain.GetComponent<Image>();

        /** 数値の初期化 **/
        // チャージ進行時間の初期化
        ChargeAmount = 0.00f;
        // ゲージ色の初期化
        GaugeImage.color = new Color(0.00f, 0.66f, 0.00f);

    }

    // Update is called once per frame
    void Update() {
    }
}

となりますね。

Update()

続いてUpdate()です。
以前の記事で、ゲージ画像の表示をFilledに設定しました。
ここではフレームごとにその値を変更する事を考えます。
具体的には、フレームごとにChargeAmountに直前のフレームからの経過時間を加算し、FillAmountに反映します。

経過時間の取得と加算

条件分けをします。
ゲージが最大値になったら処理をやめるよう、ChargeAmountが1.00の時は何もしません。
それ以外である時は、ChargeAmountに前のフレームからの経過時間を加算します。
その上で、1.00を越えている場合は1.00を代入し直します。
ここでは「ChargeAmountと1.00の2つのうち、最小値を取る」という形をとりました。

FillAmountに反映

上の項で更新したChargeAmountを、ゲージ本体画像のFillAmountに代入します。

記述

これらを纏めると、同スクリプトのUpdate()の中身はこうなります

// 省略
    void Update() {

        /** ゲージ加算処理 **/
        // ChargeAmountが1.00である場合
        if (ChargeAmount == 1.00f) {
	        // 処理なし
            return;
            
        // 上記以外のとき
        } else {
	        // 前回のフレームからの経過時間を加算
            ChargeAmount += Time.deltaTime;
            // 1.00を越えている場合、1.00とする
            ChargeAmount = Mathf.Min(ChargeAmount, 1.00f); 
        }

        /** ゲージ画像のリフレッシュ **/
        // FillAmountにChargeAmountの値を代入
        GaugeImage.fillAmount = ChargeAmount;
    }
} // <Charge.cs>末尾

休憩

ここで一度エラーが出ないか確認してみましょう。
エラーがなければボタンにアタッチし、シーンを再生してみてください。
ゲージは正しく(1秒間かけて)伸びたでしょうか。

長くなってきましたので今回はここまでにします。
次回はボタンを操作できるようにしていきたいと思います。おたのしみに!

フォロワー以上限定無料

ゲーム進捗に関する内容はフォロワー限定公開になります。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Fi-Mo 2020/07/03 12:00

進捗報告(14) + Unity Learnについて

概要

明山昇です。

今回は
・Unity Learnの無償公開
・防御ア二メーション
です。

Unity Learnの無償公開

先日、Unity公式で用意されている学習用教材である、Unity Learn Premiumが無償公開されるようになりました。
https://learn.unity.com
これはUnityの使い方を学ぶためのチュートリアルコースをまとめたUnity公式の学習サイトです。

元々は無償で利用できるUnity Learnと有償で利用できるUnity Learn Premiumに分かれていたのですが、6/24でその境目が無くなり、完全無料で利用出来るとのことです。
参考:https://note.com/unityjapan/n/n78161f2d0acd

こういった場合どうしても「英語の教材ばっかりなんじゃないの?」と思われる方もいらっしゃるかと思いますが、言語で絞り込みしてみても、日本語の教材も十分に用意されています。


↑青いところで[日本語]のみにチェックを入れれば、日本語の教材だけ表示されます。

10分くらいで終わるコースもあれば、以下のような、3時間超えの十分なボリュームを持ったコースも用意されています。
また、上のnoteにある通り、今後積極的に日本語への翻訳も行われる予定との事です。

気になった方は是非ご自身のUnity IDで学習を始めてみて下さい。

フォロワー以上限定無料

ゲーム進捗に関する内容はフォロワー限定公開になります。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Fi-Mo 2020/06/26 12:00

進捗報告(13) + UnityAssetStoreのセール

概要

泡盛もろみです。

今回は
・Unity Asset Storeのセール
・タイトル画面公開
です。

Unity Asset Storeのセール

明山昇です。
皆さんは30%オフとか50%オフとか聞くと、必要ないのにお得な気がして買ってしまう、そんな経験は無いでしょうか。私はあります。そうして溜まった積みゲーがどれだけあるか。考えたくもありません。
ですが今からお話しするのは間違いなくお得な話です。(詐欺みたいな導入)

ご存知かとは思いますが、UnityにはAsset Storeという、各種素材…3Dモデルや画像などを購入出来るショップがあります。
https://assetstore.unity.com
こちらのサイトで現在、「Fantastic Fantasy Mega Bundle」というものが販売されています。
https://assetstore.unity.com/mega-bundles/fantastic-fantasy
これが恐ろしい事に、通常$45.98のアセットが、たった$9.99で購入出来るのです。
更にそれだけでは無く…。サイトの下に進むにつれて、「Get more for just $19.99+」「Get everything for only $29.99+」という表記があると思います。これは、「追加で$19.99出せば」では無く、「$19.99出せば($9.99のバンドルに)加えて」その下に書かれたアセットも追加される、という意味です。つまり$9.99のバンドルも内包しています。
$29.99のバンドルに至っては、$9.99、$19.99それぞれのバンドルを内包した上で、更に7つのアセットが追加されます。通常価格の合計は$466.91!!それがたったの$29.99で!!しかも何れも素材としてかなり出来が良さそう!!

という事で当サークルでは、この意味を理解した瞬間、購入を決定しました。
まだ実際に使うかどうかは決まっていませんが、何れにせよ持っておくに越した事はありません。
実際、インポートするだけで、こんな感じのシーンがすぐに作れます。

素材収穫の画面っぽくないですか?
これはサンプルとして用意されたSceneに対しUIを貼り付けただけです。小屋の素材などは別個に用意されていますので、自分で自由に組み合わせて小屋や大きめの家などを作る事も可能です。

とかくお得なバンドルですので、是非皆様も購入をご検討下さい。(回し者ではありません、念のため)
ただ、このセールは月末までなので、この記事が載っているであろう26日の時点で、残り3日程度になっていると思います。決断はお早めに。

フォロワー以上限定無料

ゲーム進捗に関する内容はフォロワー限定公開になります。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Fi-Mo 2020/06/12 12:00

進捗報告(11) + Blenderの練習

概要

泡盛もろみです。

今回は
・最近のBlenderの練習成果
・ロゴ画像の作成
です。

最近のBlenderの練習成果

Blenderでの3Dモデル作成の練習にお城を作成しました。
実は和城を舞台にしたゲームなども案が出ているので、その舞台をつくるための練習も兼ねています(?)。

今回作成したのは松本城です。



テクスチャなど用意すればもう少しリアルになるかもしれません。
月見櫓の欄干など若干手抜きしている部分もあります。

これをUnityに取り込んで自作シェーダを適用するとこうなります。


騎士が並ぶと違和感がありますが、松本城は実物大のスケールで作成してあります。
フィールドも広めに作ってあるので、このまま松本城付近を走りまわれるゲームなんかも作れるかもしれません。

和城ゲームもそのうち作りたいです。

フォロワー以上限定無料

ゲーム進捗に関する内容はフォロワー限定公開になります。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

Fi-Mo 2020/06/05 12:00

進捗報告(10) + UI用ボタンの作成とか

概要

泡盛もろみです。

今回は
・UIボタンの作成 (byミサゴ)
・作成したアニメーションの紹介 (by昇)
です。

UIボタンの作成

東雲ミサゴです。

今回は技術面の記事として、前回作ったゲージ付きボタンの作成の流れを紹介したいと思います。
詳しい方も沢山おられると思いますが、自分用の覚書も兼ねて初歩的な事も書いておきたいと思います。

今回はまず、ゲージのついたボタンの見た目を作っていきます。

画像の準備(エディタ外の作業)

スプライト(2D画像)として使う画像を作成します。
ボタンのアイコンとして用いる円形の画像と、その画像より外径が20px大きい円形の画像を作成します。
これらを重ねた際にはみ出す10px分をゲージとします。今回は100pxと120pxとしました。


(↑使いたい部分以外は透過させておく)

これを、pngなどの透過情報が保存される形で出力しておきます。
後に説明がありますが、特にゲージ用の物は真っ白にしておきます。

エディタへの取り込みと設定

上記の画像をエディタに取り込み、InspectorからTexture TypeをSpriteに変更します。


(↑この部分が最初はDefaultになっている)

(↑設定を終えたら、下の方にあるApplyを押して適用する)
ボタン用、ゲージ用どちらも設定してくださいね!

ボタンの配置

ボタン本体となるオブジェクトを作成します。
HierarchyウィンドウにCanvasを、その子オブジェクトとしてUi-Buttonを作成します。
(CanvasはUIを描画するための領域です)
このButtonを選択し、WidthとHeightを大きい方の画像の外径に合わせます。(↓ここでは120x120)


(↑配置はこんなイメージ)

そして、Image内のSource Imageに先程の外径120のSpriteを指定します。
Projectウィンドウから設定欄にドラッグ&ドロップが分かりやすいと思います。


(↑ここへドラッグアンドドロップの他、右のボタンを押して出る窓から選択することもできます)

ここでSource Image直下のColorを変更しておいても良いでしょう。上の画像ではグレーっぽい色になっています。
ゲージがない状態での背景として表示させたい色を指定しておきます。

最初に画像を準備した際に真っ白にしたのは、ここの都合です。
指定色になるのではなく乗算のようで、あとから色を変更する事を考えると白が分かりやすそうです。
(特に私はこれまで画像を触ってきていないので、目的の色を出すのに苦労する)
画像を複数準備して差し替える、という場合はこの限りではありません。

さらに画像を配置

続けて、ゲージとして伸縮する部分とボタン中央のアイコンとなる部分の画像も配置します。
先程のボタンの子オブジェクトとしてUI-Imageを2つ作成し、同様の流れでSource Imageを指定していきます。


(↑ゲージとボタンアイコンのオブジェクトをボタンの子として配置)

1つめにはゲージ用の外径120、2つめにはボタンアイコン用の外径100のものを指定します。

ここで注意点ですが、UI-Imageはデフォルトでは100x100で作成されてしまうようなので、ゲージに用いる側のオブジェクトはInspectorのRect TransformからWidthとHeightを120にしておきます。

指定できたら、ゲージのInspectorから色を変更してみましょう。
サイズの設定が出来ていれば、アイコン部分の外側にゲージの色が表示されるはずです。


(↑この順番でぴったり重なっているイメージ)

これで見た目が出来上がりました。
この緑色の部分が表示される割合を増減させることで、ゲージを表現しています。

ゲージとして動かすために

さて、形は出来上がりましたが、どこをどう操作すればゲージが動いて見えるでしょうか。
設定していくのは動かしたい部分なので真ん中の画像ですね。

Hierarchyウィンドウからボタンの子オブジェクトとして配置したUI-Imageを選択し、Inspectorから…

Image Typeの指定

Image Typeでは画像の表示方法を指定することとができますが、この中からFilledを選択します。


(↑デフォルトではSimpleになっている)

するとImage Type以下の項目がFiled用に変わり、その中にFill Amountというものがあります。


(↑Filledを選択すると項目が変わる)

このFill Amountを0〜1の間で指定することで、画像がその割合だけ表示されるようになります
(拡大縮小ではなく、始点から終点に向けて順に表示していく形)

Fill MethodとFill Originの指定

Fill Methodの項目からRadial 360を選択します。初期値がこれかもしれません。
さらにFill Originの項目から起点を選択します。


(↑今回はTopを選択し、上を起点とした)

Clockwiseのチェックボックスは、有効にすると時計回り、無効にすると反時計回りになります。

〜〜
余談になりますが、回転する動きは他にRadial 90、Radial 180があり、それぞれ90度、180度の扇形に動きます。
デジタル式のスピードメーターのような動きには良いかもしれませんね。
直線的に動くものはHorizontal、Verticalでそれぞれ横向き、縦向きの動きになります。
こちらは棒状のゲージが伸びていくイメージですね。
〜〜

とりあえず完成

こうして下のようなものが出来ました。




(↑順にゲージが伸びていく様子)

エディタ上ではこれで一段落となります。やったぜ。
最終的にはこれをスクリプトから操作していく事になります。

切りが良いので今回はここまでとします。

フォロワー以上限定無料

ゲーム進捗に関する内容はフォロワー限定公開になります。

無料

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

1 2 3 4 5

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索