makeagame’s blog

UnityとVroidに関する情報を掲載しています。

Unity ブログ -Game Clearの定義-

このブログでわかること
・unityの基礎用語
・unityで躓きやすいカメラにいて
・unityで躓いたら見て欲しいところ
 
このブログはこんな方向け!
・Unity辞めたって人
・Unityやってみたいって人
・ゲーム作りに興味がある人
 
今回、私が作っているブロック崩しのゲームクリア条件についてのお話をしたいと思います。
 
ブロック崩しですから、ブロックが全部壊せたらゲームクリアになるわけですね。
 
でも、ブロックが全部壊れたとスクリプトに読み込ませるのはどうしたらいいのでしょうか?
 
結構ごり押しなのが「空のオブジェクトにすべてのブロックを読み込み、なくなったかなくなってないかを判断してもらう」みたいなことも可能です。
 
が、しかしかなり面倒くさくなりますし、おそらくメモリもめちゃくちゃ重くなってしまうと思うんですよね。
 
で、こういう時に役立つのが子オブジェクトの数を数える関数があるということです。
 
それが『childCount』なのです。
 
これは結構使い勝手もいいし、応用も利きそうな感じがするので知ってお得な関数だと思っております。
 

『childCount』の使い方

私はこのように使っております。

 

if(this.transform.childCount == 0)

{

   Destroy(gameObject);

}

 

こう書くことで「このオブジェクトの子オブジェクトの数が0になったら、このゲームオブジェクトを壊す」となります。

 

空のオブジェクトの中にブロックを入れておき、全部ブロックがなくなったら空のオブジェクトが壊れたり、0になったときにまた何かをするなどのフラグとしても有効です。

 

今回、ブロック内のスクリプト

 

void OnCollisionEnter(Collision collision)
{       
    Destroy(gameObject);
}

 
のように、何かが触れたら壊れるという風に書いております。
 
ブロック崩しですから、ボールが当たり、壊れていくわけですね。
 
で、下図のように空オブジェクトの中にブロックのオブジェクトを作ることでゲームクリア条件を作っているわけですね。

と、こういうような感じで空のオブジェクト内にブロックを敷き詰めていくことができます。
 
で、全部のブロックがなくなって空のオブジェクトのみになったら、読み込ませた「Game Clear」の文字を表示させたりなどができるわけですね。
 
ちょこっと例を出したいと思います。
 

using UnityEngine.UI;
using TMPro;

 

    Transform myTransform;
    public GameObject targetbutton;
    public GameObject TextMPgameover3;

    public GameObject targetball2;
    public GameObject player2;


    void Start()
    {
        myTransform = transform;
    }   

 

 void Update()
    {
        if (myTransform.childCount == 0)
        {
            TextMPgameover3.SetActive(true); //game clear
            targetbutton.SetActive(true); //reward

            targetball2.GetComponent<Rigidbody>().velocity = Vector3.zero;
            targetball2.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
            player2.GetComponent<Rigidbody>().velocity = Vector3.zero;
            player2.GetComponent<Rigidbody>().angularVelocity = Vector3.zero;
        }
    }

 

解説です!
Game Clearの文字を出したいので『public GameObject TextMPgameover3』で定義しております。
 
で、文字を出すにはUnityのUIを読み込む必要があるので、定義の前、一番最初に
 
『using UnityEngine.UI;』
『using TMPro;』
 
の2つを書いておく必要があります。
 
で、Start関数で初期化しておきます。
『myTransform.childCount == 0』で子オブジェクト(ブロック)が0になったら、各スクリプトが実施されるという流れですね。
 
if文の1行目はGame Clearの文字が出現すること
2行目はゲームクリア報酬で、画像が出現するボタンを表示させること
3行目以降はゲームクリアと同時に操作できる部分を止める必要があるため、ボールとプレイヤーの部分を止めていくスクリプトとなります。
 
これでゲームクリアの処理は完了です!
 
いかがでしたでしょうか?
ゲームクリア時に自機を止めるなど結構忘れがちになってバグにつながる恐れがあるのでその辺も注意していけるといいですね!
少しでも参考になれば幸いです。それでは!
 

Unity ブログ -オブジェクトの表示と非表示の話-

このブログでわかること
・unityの基礎用語
・unityで躓きやすいカメラにいて
・unityで躓いたら見て欲しいところ
 
このブログはこんな方向け!
・Unity辞めたって人
・Unityやってみたいって人
・ゲーム作りに興味がある人
 
今回のメインはUnityゲームのオブジェクトを表示したり非表示したりのお話です。
 
私はブロック崩しのゲームを作ってみたいなぁ~と思って色々調べて作ってみまして……。
 
色々張り切っちゃいましたよね。
よくブロック崩しといえば自機はただの棒でちょっと面白味ないよねーってなったらすぐにキャラクター出してアニメーション付けて遊んだり……。
 
(参照動画)
 
 
で、見ていただきたいのが、オブジェクトの表示/非表示のところです。
別動画になりますが、こちらをご覧ください。

(動画参照)
 
この動画では、とあるオブジェクト(スフィア)に当たると順繰りにエフェクトオブジェクト(吹き出し)が表示されるというものです。順番は「♡」→「♪」→「☆」→「なし」となり当たり続ける限りめぐっていきます。
 
ちょっとした面白要素ですね。これ、プログラミングだと意外と重要な考え方を応用して実現させております。難しい方だとSin関数使ったりするらしいですが、もっと簡単な手法をしておりまして、昔これの使い方を教えてもらったときは「なるほど~」と思ったのでご紹介します。

 

考え方

  1. スフィアにボールが当たる
  2. エフェクトを表示させる
  3. エフェクトを変える

みたいなざっくりとした考えとなりますが、そこからどうスクリプトに組み込むかを考えていきます。

 

で、私が考えたのがスフィアに当たった回数を保存させて、その当たった回数に応じてエフェクトオブジェクト(吹き出し)を変えて表示するというものでした。

 

この考え方が一番わかりやすいですね。

 

で、いつスフィアにボールが当たってもいいようにUpdate関数に入れていきます。

で、完成したスクリプトがこちらです。

 

    int HitCount = 0;
    int Hitcal = 0;

    public GameObject balleffect;
    public GameObject emotionheart;
    public GameObject emotionnote;
    public GameObject emotionstar;

 

 void Update()
    {
        Hitcal=HitCount%4;
        if(Hitcal == 1)
        {
            emotionheart.GetComponent<heartappear>().heartActive();
            emotionnote.GetComponent<noteappear>().noteHide();
            emotionstar.GetComponent<starappear>().starHide();
        }
        else if(Hitcal == 2)
        {
            emotionheart.GetComponent<heartappear>().heartHide();
            emotionnote.GetComponent<noteappear>().noteActive();
            emotionstar.GetComponent<starappear>().starHide();
        }
        else if(Hitcal == 3)
        {
            emotionheart.GetComponent<heartappear>().heartHide();
            emotionnote.GetComponent<noteappear>().noteHide();
            emotionstar.GetComponent<starappear>().starActive();
        }
        else
        {
            emotionheart.GetComponent<heartappear>().heartHide();
            emotionnote.GetComponent<noteappear>().noteHide();
            emotionstar.GetComponent<starappear>().starHide();
        }
    }

 

    private void OnCollisionEnter(Collision collision)
    {
        if(collision.gameObject == balleffect)
        {
            HitCount++;
        }
    }

1つずつこのスクリプトを見ていきますね。

肝となるのがここの部分「HitCount%4

」の計算……これは割り算をしております。

 

しかもただの割り算ではありません。

割り算した結果のあまりを計算するのです。

なのでこの式の場合、値は絶対に「0」「1」「2」「3」のどれかになるわけです。

 

今回のスクリプトの場合スフィアがボールに当たって、当たった回数が「1」になったら、ハートマークのエフェクトオブジェクトが表示されます。当たった回数が「2」になれば、ハートマークが消えて、音符マークに切り替わります。当たった回数が「3」になれば、音符マークから星マークに切り替わり、最後4回当たったら、割り算の計算結果は「0」。そうなったらすべてを非表示になります。元の数字は「0」なので、初期化するという意味も含めて、「0」の時にすべて非表示の方が都合がいいですね。

 

スフィアにボールが何度当たっても4つの値のどれかにしかならないんですよね。

この考え方をしっかり身に着けられるかどうかで思いついたことが実行できるかできないか結構分れる(気がする)んですよね。

 

後はif文で条件付けしちゃえば順番通りにエフェクトオブジェクトが切り替わっていくという寸法です。

if文内は関数を割り当て、目当てのエフェクトオブジェクトを表示させ、他を非表示させているだけですね。starHide()とかstarActive()内の関数はそのままSetActive関数を用いてtrue/falseで管理しております。

 

動画内ではスフィアの色も変えておりますが、このif文内に付けてたりもしてますね。

GetComponent<Renderer>().material.color = Color.red;

と書くことで、マテリアル内のカラーを変更(この場合は赤に)することができます。

 

で、スフィアにボールが何回当たっているかを、 OnCollisionEnter関数で計算しております。

 

長いですが、かなりわかりやすく、自分で把握しやすくなるんですよね。

 

自分で書いたスクリプトでも、結構他からそのままコピペして、結果見返してみても訳がわからないということになることが多いです。

 

しっかりコメントとか残すのがいいと思います。

(Unity内だと日本語が文字化けしてしまってなんか嫌になっちゃうんですけどね。)

 

今回のお話はここまでです。

割り算の考え方の例をご紹介しました。

「%」こいつは結構使えるのでぜひとも参考にしていただければ幸いです。

 

Unityブログ -指定した色が付かない問題-

このブログでわかること
・unityの基礎用語
・unityで躓きやすいカメラにいて
・unityで躓いたら見て欲しいところ
 
このブログはこんな方向け!
・Unity辞めたって人
・Unityやってみたいって人
・ゲーム作りに興味がある人
 
今回は失敗談をお伝えします。
そしてその解決法も……。
もし同じ人で躓いている人が居たら参考にしていただけると嬉しいです。
 
インスペクターとかアセットとかよくわかんねー!専門用語やめてくれー!ってなわけで専門用語を極力使わずゲーム作りしたいtako0001です。
 
今回はブロック崩しゲームを作りてぇってなったのでその過程で躓いた部分をお伝えします。
 
unityのインストールとか、キューブの出し方とかスフィアの出し方とかその辺の奴は他のところ見てください。そっちの方がめちゃくちゃわかりやすいです。
 
今回私が躓いたところはカメラのことでして、ここをむやみやたらに弄ると痛い目を見てしまうというのをお伝えします。
 
『オブジェクトの色を変えたのに、指定した色になってない』
こんなことはありませんか?オブジェクトの色が白に指定したのになぜか黄色が移っていたり、全体的になんか黄色っぽくなってたり……。
 
まぁ黄色以外にもあるんですけど、とにかく指定した色と違う色になってしまった経験はございませんでしょうか?
 
答えは……カメラにありました。

 
<Hierarchy>の[Camera]を選択して、<inspector>を見ていただくと真ん中上くらいに「背景」という文字があり、そこを選択すると色を指定することができるようになります。
 
ここはカメラの色になるので、ほかのオブジェクトにも影響してしまいます。まるで、カメラのレンズに色付きセロファンをつけたかのように、被写体全部に色が付いてしまうような仕様ですね。
 
なので、「なんで!ボールの色!よくわからんことになってるのっ!」とかそういう事態に陥ることがしばしばあります。
 
他のイメージとしては、カメラに色付きメガネをかけるようなイメージですね。効果としてはどうなんでしょう?セピア色とかにしたいときに弄る的な使い方でしょうか?
 
こういうこともできるよって機能ですが、適当にいじると大変なことになるのです。
 
Unity、イジらないとしっかり自分のモノに出来ないけれど、イジってわからなくなると解決に時間を要する(おそらくプロでも)のが難題ですね。
 
なのでカメラについて慣れるのが一つのステップかと思います。
 
■カメラのインスペクターを見てみよう!
[Camera]の情報を把握するのはこの<inspector>の部分を見ることは必須です。

<inspector>上で確認したい項目は2つ
・位置
・サイズ
でしょうか。
 
位置はその名前の通り座標を示します。
X軸のどこでY軸のどこでZ軸上のどこにあるのか……。
2DゲームだからZ軸上とかいらなくね?って最初は思ってましたが何気にZ軸の値も重要になるので抑えておくべきことですね。
 
えぇ。配置していてシーン上は映っているのにゲームになるとなぜか消えて映らなくなるなんてのはZ軸の値が悪かったりすることもあるので注意が必要なのです。
 
そしてサイズ。
ここの数値をちょっと弄るだけでオブジェクトが遠くに感じられるようになったりするのでゲームに適切な数値をはじめのうちに決めておくのが大事になったりします。自分はよく12くらいの数値を入れております。
 
ちなみにこのゲームは前々前回くらいからやっている[Block Breaker Template]のカメラとなります。せっかくですのでそのインスペクターの構成を見てみましょう。

全部で4つのようですね。
・Transform
・Camera
・Flare Layer
・Audio Listener
 
です!
Transformは位置、Cameraはその距離や表示するディスプレイなどの管理です。
 
Flare Layerについてはこちらから引用します。
Flare Layer コンポーネントを カメラ に追加して、画像に レンズフレア を表示させることができます。デフォルトでは、カメラにはすでにフレアレイヤーが追加されています。
Lens Flare (レンズフレア) は、カメラのレンズ内で屈折する光の効果をシミュレートします。明るい、あるいはぼんやりとした光を表現するのに、、シーンにちょっとした雰囲気を加えるために使用されます。
Audio Listenerは音を管理するコンポーネントですね。よく音楽プレイヤーとして例えられるやつです。Audio Sourceは音源で、Audio Listenerがプレイヤーというわけです。
 
今回はこれまでとなります!
このようにまずはカメラは構造を読み解くのも一つの手ですね!では!

UnityでVRoidキャラクターを動かしてみた①

このブログはこんな方向け!

・Unity辞めたって人

・Unityやってみたいって人

・ゲーム作りに興味がある人

 

この記事でわかること

・unityでVRoidキャラクターを入れる方法

・VRoidキャラクターの動かし方

・動きの編集について

 

 

アニメのような3Dキャラクターを手軽に!無料で!簡単に作れちゃうVRoidですが、それをゲームで動かせるかもしれないと考えると、楽しくなりそうです!また、背景で簡単なモーションをモブキャラがしていたら、それだけで少しクオリティがアップしそうです。

 

でも実際に動かすのって出来るの?難しくないの?

と思うかもしれません。

 

実際に動かすことが可能です!

ものの数十分で出来たりします!

 

その手順についてご説明しますね!

 

全体の流れはこんな感じです。

  1. VRoidデータを読み込もう!
  2. mixamoからFBXデータをダウンロードしよう!
  3. FBXデータをUnityに取り込もう!
  4. アニメーターを設定しよう!
  5. FBX同士を繋げてみよう!
  6. 背景を設定してみよう!

 

今回は1-3について説明しますね!

 

■VRoidをunityに読み込もう!

さっそく、VRoidで作ったキャラクターをUnity内で読み込んでみましょう。

ですがそのままUnityで読み込むことは出来ません。

準備が必要となります。

それがこちら!『UniVRM』

 

これをインストールする必要があります。

Unityのインストールはマイアセットなどが主流ですが、これはそんなに手間がかかるものではありません。

こちらのURLからDownloadの横の青い文字のボタンを押すだけです。

するとVRM-0.107.2(2023年1月現在)ファイルがDLされています。

これをダブルクリックしてインストールボタンを押すだけです!

 

VRMキャラクターをUnityに入れてみよう

Unityを開いて、プロジェクト欄にあるAssetsの中にドラック&ドロップします。

すると、Prefab化したデータが生成されるので、それをHierarchyやSpaceにドラック&ドロップすることでUnity内で動かすことが出来るようになります。

読み込めていない場合は、VRMデータをクリックしてInspectorを見てください。

タブが3つあり、Model,Materials,Vrmがあると思います。

そのうちModelを選択し、Migrate To Vrm1 にチェックを入れてApply(適用)をクリックします。すると、プレハブのように動かせるようになると思います。

 

■MixamoからFBXデータをダウンロードしよう

続いて動いてほしいモーションデータのダウンロードです。

Mixamoというサイトがあります。

これはモーションデータをたくさんあるAdobeが運営しているサイトだそうです!

 

〇まずはサインイン

私はGoogleとの連携でログインしました。

するとこういうページになります。

左上の虫眼鏡マークのところが検索欄で、ここにキーワードを入れてモーションを探します。

walk とか jump とかですね! Danceもありますが、盆踊り的なイメージを持っていただけると良いですね。全部見たわけじゃないですが、すぐMMDで活用できる!というのはなさそうです。

 

1つ選んだら下図のような感じになります。

このモーションだと5つのパラメーターを操作できそうですね。

色々弄ってみると面白いですね。

例えばこの欄の上の[Enthusiasm]ここを0にすると左右前後の範囲が狭まり、100にすると範囲が広くなります。

[Mood]だと顔の向きなどが変わりますね。

[Overdrive]の値は全体スピードと考えても差し支えなさそうです。

などなど、気に入ったパラメーターにしてダウンロードすることが出来ます。

 

■FBXデータをUnityに取り組んで設定

Unityでは特に何もせずともFBXデータを読み込んでくれます。

ただし、VRMデータにモーションを当てる時は注意が必要です。

モーションデータの設定を弄る必要があるからです。

方法は簡単です。

モーションデータを選択して、Inspectorを見ます。

そして下のRigタブをクリックしてもらい、アニメーションタイプをヒューマノイドに選択してもらいます。

 

そうすることで、Prefab化したVRMのキャラクターでもFBXのモーションデータでモーション通りに動かすことが出来るようになります。

 

そして次がアニメーションですが、今回はここまでとしますね。

次回は続き、アニメーターの設定です。

少しでも参考になれば幸いです。それでは!