投稿記事

g_clickerの記事 (16)

Fi-Mo 2020/08/21 12:00

進捗報告(21) + onDrawGizmos

概要

泡盛もろみです。

今回は
・OnDrawGizmos (by 泡盛もろみ)
・進捗報告(21):アニメーション適用 (by 明山昇)
です。

OnDrawGizmos

Gizmosって聞いて何かわかりますか?
私はわかりませんでした。
ざっくりというと、Unityでオブジェクトなどを選択した時に表示される補助的な視覚情報のようなものです。

Gizmos OFF

Gizmos ON

GizmosをONにすると、CapsuleColliderの緑の線が見えるようになっていますね。
このGizmosはシーンビューだけでなくゲームビューでもONにすることができます。
当たり判定などを確認する時に便利ですね。

このGizmosの表示を自分で拡張できることを知りました。
OnDrawGizmos()
の中に描画処理を書くだけです。

公式リファレンスは下記
MonoBehaviour.OnDrawGizmos()

実際の使い方としては、例えばこんな感じでrigidbodyの速度を表示してあげています。
キャラクターから線が伸びているのがわかるでしょうか。
速度のベクトルがキャラクターにとって前方であればマゼンタ、後方であればシアンの線が、速度に応じた長さで表示されるようにしています。


private void OnDrawGizmos() {
  float angle = Vector3.Angle(transform.forward, rigid.velocity);
  bool isForward = (-90 < angle && angle < 90);
  if (isForward) {
    Gizmos.color = Color.magenta;
  } else {
    Gizmos.color = Color.cyan;
  }
  Vector3 pos = transform.position;
  Gizmos.DrawLine(pos, pos + rigid.velocity);
}

速度などの情報は目に見えないので、こうやって視覚的に把握できるようになると便利ですね。
また、通常はオブジェクトを選択しないとそのオブジェクトのGizmosが表示されないのですが、ここに書いてあるものは常時表示されるので、生成後すぐに破棄されるようなオブジェクトの当たり判定なども、躍起になって一時停止して選択して...ということもなく見ているだけである程度チェック可能になります。
実際の領域と少し大きく/小さくした領域を描画して、どのくらいの大きさにするか検討するなどもできるかもしれません。

また何か便利なものを見つけたら紹介します。

フォロワー以上限定無料

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

無料

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

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

Fi-Mo 2020/08/07 12:00

進捗報告(19)

概要

泡盛もろみです。

今回は
・執筆中の小説の宣伝(明山昇)
・ゲーム進捗(by 泡盛もろみ)
です。

執筆中の小説の宣伝

明山昇です。今回は、いつもの技術/雑談の枠を使わせてもらって、ちょっと宣伝をば。

私はサークル活動でアニメーションを作りながら、個人の活動として、小説家になろうとカクヨムで小説の連載をしております。
現在は隔日周期で更新継続中です。
普通(?)のなろう系とは一味違うモノをと心がけて日々執筆に勤しんでおります。(少々妙ちきりんすぎる話になっている気もしますが)
もしお時間ありましたら読んでいただけますと幸いです。

現在更新中の話

小説家になろう: http://ncode.syosetu.com/n4667fz/
カクヨム: https://kakuyomu.jp/works/1177354054893804017

その他

小説家になろうマイページ: https://mypage.syosetu.com/1499122/

フォロワー以上限定無料

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

無料

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

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

Fi-Mo 2020/07/24 13:30

進捗報告(17) + 続々・UI用ボタンの続き

概要

泡盛もろみです。

今回は
・続々・UI用ボタンの続き (by ミサゴ)
・ダメージを受けるアニメーション (by 明山昇)
です。

続々・UI用ボタンの続き

東雲ミサゴです。

前回に引き続き、UI用ボタンについて紹介します。
前回はチャージの進行状態が100%の時のみ操作を受け付る作りにしましたが、これを視覚的に表現してみます。

やりたいこと

今回は以下の2点を操作します
1. チャージ中と完了時時のゲージ色の変更
2. 操作が不能である間のボタンの表示の変更

前者はスクリプト作成の最初の記事で初期化だけ行ったGaugeImage.colorの出番です。
これをスクリプトから操作しようというわけですね。
後者はButtonコンポーネントのパラメータを変更します。

ゲージ色の変更

ゲージの色をChargeAmountが1未満である間は赤、1の時は緑で表示します。

変数の宣言と初期化……のその前に

ここでお詫びが1点あります。最初の記事にミスがありました。
まとめの部分を写した場合は動いたと思いますが、丁寧に上から進めて下さった方は整合性がなくて戸惑ってしまわれたのではないかと思います。お詫び申し上げます。
(現在は訂正済みです)

訂正内容

具体的にはStart()項の最初の"オブジェクトの取得"から

// このスクリプトをアタッチしたオブジェクトの画像を取得
GaugeBase = GetComponent<Image> 

また、"変数の初期化"から

// ゲージ背景色の初期化
GaugeBase.color = new Color(0.40f, 0.40f, 0.40f);

が、当該記事の時点では不要となります。
つまり今回これを使用します。

改めて宣言と初期化

ここでは上記の内容に加え、変数の宣言にゲージ背景画像を追加します。

// ゲージ背景画像
private Image GaugeBase;

また、ゲージ色の初期化の際の色を緑から赤に変更します。

GaugeImage.color = new Color(0.00f, 0.66f, 0.00f);

↓↓↓変更↓↓↓

GaugeImage.color = new Color(0.66f, 0.00f, 0.00f);

長くなってしまいますが、classからStart()まで記します。

/** 省略 **/
public class Charge : MonoBehaviour {

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

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

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

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

        /** 数値の初期化 **/
        // チャージ進行時間の初期化
        ChargeAmount = 0.00f;
        // ゲージ色の初期化
        GaugeImage.color = new Color(0.66f, 0.00f, 0.00f); /** 変更 **/
        // ゲージ背景色の初期化
        GaugeBase.color = new Color(0.40f, 0.40f, 0.44f); /** 追加 **/

    }
/** 省略 **/

パラメータ変更

ではフレーム毎に見た目を更新するための部分に移ります。
Update()のゲージ加算処理の後に、ChargeAmountの値によりGaugeBase.colorを変更する処理を追加します

/** ゲージ・ボタン色管理 **/
// ChargeAmountが1のとき
if (ChargeAmount == 1.00f) {
    // 背景色を緑に
    GaugeBase.color = new Color(0.00f, 0.66f, 0.00f);
// 上記以外のとき
} else {
    // 背景色をグレーに
    GaugeBase.color = new Color(0.40f, 0.40f, 0.44f);
}

また、画像のリフレッシュの処理を変更し、FillAmountに代入する値をChargeAmountからChargeAmountの小数部分に変更します。

/** ゲージ画像のリフレッシュ **/
// FillAmountにChargeAmountの値を代入
GaugeImage.fillAmount = ChargeAmount;

↓↓↓変更↓↓↓

/** ゲージ画像のリフレッシュ **/
// FillAmountにChargeAmountの小数部分を代入
GaugeImage.fillAmount = ChargeAmount % 1;

ChargeAmountが1.00の時、FillAmountは0となり緑色になったGaugeBaseを見せるようにしています。
今後ゲージを複数ストックできるように拡張する際に便利だと良いなという思いでこういう書き方にしましたが、あまりスマートでないかもしれません。

ここまでを纏めると、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);
        }

        /** ゲージ・ボタン色管理 **/
        // ChargeAmountが1のとき
        if (ChargeAmount == 1.00f) {
            // 背景色を緑に
            GaugeBase.color = new Color(0.00f, 0.66f, 0.00f);
        // 上記以外のとき
        } else {
            // 背景色をグレーに
            GaugeBase.color = new Color(0.40f, 0.40f, 0.44f);
        }

        /** ゲージ画像のリフレッシュ **/
        // FillAmountにChargeAmountの小数部分を代入
        GaugeImage.fillAmount = ChargeAmount % 1; /** 変更 **/

    }
/** 省略 **/

操作不能の間の表示

ChargeAmountが1未満であるとき、(スクリプトがアタッチされているボタンオブジェクトの)ButtonコンポーネントのInteractableをfalseにします。
これにより、ボタンが物理的に無効になります。
Buttonコンポーネントはボタンの状態により見た目を変更するパラメータを持っているので、状態に応じて色を変えたり画像を差し替えたりすることができます。
今回は色の変更で状態を表現するようにします。

エディタ上での画像と色の指定、コードでのパラメータ変更

エディタ作業

ここで一度エディタに移ります。
ボタン本体のオブジェクトを選択し、InspectorのButtonコンポーネントを確認しましょう。

Transitionの値がColor Tintになっていなければ、プルダウンメニューから選択ます。
Target Graphicの値が、デフォルトでは"ボタン本体のオブジェクト名 (Image)"となっていると思います。
この画像はゲージの背景部分に使用するように設定してしまっているので、このままではこの部分の見た目が変わっても殆ど目に見えません。
そこで、Hierarcheyビューのボタンアイコン(記事ではButtonIconの名前)のオブジェクトを指定します。
ドラッグアンドドロップでも良いですが、Projectビューの画像ではなくHierarcheyビューのオブジェクトの指定である事に注意します。

さらに、Disabled Colorの値を設定します。
色は元々グレーですがお好みで、透過度は1に変更します。

コードの追加

ではコード編集に戻ります。

Start()にInteractableの初期化を追加します。

    void Start() {

        /** 省略 **/ 
        
        /** 数値の初期化 **/
        // チャージ進行時間の初期化
        ChargeAmount = 0.00f;
        // ゲージ色の初期化
        GaugeImage.color = new Color(0.66f, 0.00f, 0.00f);
        // ゲージ背景色の初期化
        GaugeBase.color = new Color(0.40f, 0.40f, 0.44f);
        // ボタンの状態の初期化
        GetComponent<Button>().interactable = false; /** 追加 **/

    }

また、Update()のゲージ・ボタン色管理の部分にパラーメータを操作する行を追加します。
条件に従い、InteractableのチェックボックスをOn/Offします。

    void Update() {

        /** 省略 **/ 

        /** ゲージ・ボタン色管理 **/
        // ChargeAmountが1のとき
        if (ChargeAmount == 1.00f) {
            // 背景色を緑に
            GaugeBase.color = new Color(0.00f, 0.66f, 0.00f);
            // ボタンを有効に
            GetComponent<Button>().interactable = true; /** 追加 **/
        // 上記以外のとき
        } else {
            // 背景色をグレーに
            GaugeBase.color = new Color(0.40f, 0.40f, 0.44f);
            // ボタンを無効に
            GetComponent<Button>().interactable = false; /** 追加 **/
        }

        /** 省略 **/ 

    }

動作確認

動作を確認してみましょう。上手く動いたでしょうか。
これで今回の目標を達成しました。お疲れ様です!
そして、この一連の記事の目標も達成です。

この後はゲージの伸びる速度を変更するにはどうすれば良いか、Updateの中に全ての処理を書くのは読みづらいので機能別にメソッド化してみる、など、思いついたところをガンガン変更してみてください。

この一連の記事で興味を持ってくださった方がおられれば幸いです。

それでは今回はこれにて。お付き合いありがとうございました!

フォロワー以上限定無料

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

無料

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

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

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で学習を始めてみて下さい。

フォロワー以上限定無料

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

無料

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

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

« 1 2 3 4

記事のタグから探す

月別アーカイブ

限定特典から探す

記事を検索