gologiusの巣

プログラミングなどの技術メモです。誰かの役に立てるとうれしいです。

Particle SystemでBillboardを無効化する(カメラ方向に常に向かないようにする)

問題

f:id:gologius:20171009101058g:plain

デフォルトだとParticleが常にカメラの方向に向く。

煙とかならよいが、壁のエフェクトを出したい、となると困る。実際困っている方がおられた。

[Unity] 頂点カラーを利用して平面メッシュをテクスチャアニメーションさせる - Qiita

解決策

「Render Alignment」を「Local」にしましょう(Unity環境は Version 2017.1.1f1)。 たぶん古いバージョンだと「Billboard Alignment」を弄ればよいと思われます。 f:id:gologius:20171009101331g:plain

f:id:gologius:20171009101428g:plain

Unity 簡単な地面との接触判定

SphereCastやらRaycastやら調べたら色々ありました。

しかし私は新しくLayerを作るのが気に入らなかった。

そこで私は考えた

Rigidbodyがアタッチされているなら、速度のy要素が(ほぼ)0になったとき、でよいのではなかろうか???

bool isGround = Mathf.Abs(rbody.velocity.y) < 0.001f ? true : false;

y要素が

  • 負なら重力による落下
  • 正ならジャンプ中など
  • (ほぼ)0なら地面に着くか、空中で静止している状態か

となる。

これでよくね?

追記(10/08)

ずっと平面なら別にいいんだけど、坂道があったらこの前提は崩壊します。

素直にSphereCastとか使いましょうね

おしまい

Akeytsuで作成したfbxをUnityでimportした場合、一部の部位が消える

Akeytsuで作成したfbxをUnityでimportした場合、一部の部位が消える場合の対処法です。

現象

Akeytsuでモーション作成 f:id:gologius:20170928201752g:plain

Unityでインポートしたモーション f:id:gologius:20170928202230g:plain

手がないですね

原因

前提説明

原因を説明する前に、このモデルの構造をお話しします。 実は、指にボーンは入っておらず、閉じた手(に武器)と開いた手の二種類(×左右の二つ)のモデルがあります。 それをスケールを1や0にすることで、表示非表示を切り替えています。

↓を見ると、閉じた手と重なった手が重なっていることが分かるかと思います。 f:id:gologius:20170928202134p:plain

デフォルトのポーズ

Unityでインポートして、シーンに配置したときにモデルがやっているポーズ。 Akeytsuで出力したfbxだと、最初に作ったAnimationがデフォルトのポーズになるみたいです。

原因説明

恐らくですが、デフォルトのモーション(ポーズ)で、スケールを0にしている部位があると、他のモーションで表示させようとすると見えなくなるみたいです。

↓のように、スケールが0の部位(この例だと閉じた手)があるポーズが、デフォルトのポーズだとダメ f:id:gologius:20170928202704p:plain

結論

Akeytsuで一番初めに作るポーズは、部位を全部Scale=1にしておきましょう。

そもそも、Akeytsuは最初はTポーズのScale=1ですし、Tポーズをとっている方がUnityでのインポート後の後処理が楽です。

Unity一週間ゲームジャム テーマ「フロー」に参加し・・・ようとして完成しなかった話

結果から言うと完成しませんでした。 原因の考察は後程

前回同様に

  • 新しい技術にチャレンジ
    • 今回はUnity2017から導入されたTimeLineを使ってみました+後で説明する波打つ床
  • 前回の反省を活かす
    • スイカ割りという、みんなすぐに思いつく&独創性がない、のでもっとオリジナリティあふれるものにしたい

というのをやっていこうと思いました。

何を作るか決める

フローと聞いて、水が思い浮かびました。凡人の発想ですね。 で、前回のこの作品が、メッシュを生成して頂点移動している話を思い出しました。

やまくずし | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう

頂点動かして、波発生させたりしたら面白そうだとおもいました。

とりあえずそれ作るか、ということで作った

ここで何を作るかきちんと決めなかったのが悪かった・・・

波打つ床

ソースは後日あげます(ゲームが完成してないのでせめてなにか残したい)

個人的には、見た目が結構面白いと思いました。なのでこれでゲーム作れたらいいなと思いました。

が、これに引きずられてアイデアが全く出てきませんでした。

その他原因と今後

  • 社会人生活ストレス
  • Switchのモンハン(ほとんどやってませんが)

Unityでオブジェクトを割る

Unityでこんな感じで画像を割ります。

f:id:gologius:20170819124203g:plain

ちなみに予め破片モデルを用意する方法です。なので、毎回割れ方は同じです。 有料Assetならもっといいのがあるのですが。

ソース

さっさとデータ欲しい、見たい人はこちら github.com

説明

先に述べたように、予めモデルを作っておいて破壊時に散らかす方法です。 DebrisにRididbodyとColoderを設定した上で非表示(SetActive(false))にしておいて、スペースキーを押すと Coliderのおかげで勝手に弾けて散らかる、という感じです。

GameObjectのDebrisの子要素に、破片用オブジェクトがないと、動かないので注意してください。

モデルはMetasequoiaで作成しました。

f:id:gologius:20170819124901p:plain

using UnityEngine;
using System.Collections;
using System.IO;


/// <summary>
/// 条件
/// * このGameObject以下に破片用の子GameObject(以下破片オブジェクト)がある
/// * 破片オブジェクトにRigidbodyとColiderが設定されている
/// </summary>
public class ImagePanel : MonoBehaviour {

    [Tooltip("表示させる画像")]
    public Texture texure = null;

    [Tooltip("破壊前に見える板")]
    public GameObject panel;

    [Tooltip("破壊後の破片を纏めているオブジェクト")]
    public GameObject debris;

    private bool isFinish = false; //debug

    void Start()
    {
        //エラー処理
        if (texure == null)
        {
            Debug.LogError("Texture is null");
            isFinish = true;
            return;
        }

        debris.SetActive(false); //飛び散らないように非アクティブにしておく

        //Texture設定
        panel.GetComponent<Renderer>().material.mainTexture = texure;
        foreach (Transform child in debris.transform)
        {
            child.gameObject.GetComponent<Renderer>().material.mainTexture = texure; //破片すべてにTexture設定
        } 
    }

    void Update () {
        //debug スペースキーを押すと爆散する
        if (Input.GetKeyDown(KeyCode.Space) && !isFinish)
        {
            crash();
            isFinish = true;
        }
    }


    public void crash()
    {
        debris.SetActive(true); //破片を表示
        debris.transform.parent = null; //Destroy(this.gameObject)に巻き込まれないように
        Destroy(debris, 10.0f);


        Destroy(this.gameObject);
    }
 }

最初は破壊前の板、このサンプルではPanelは使用していませんでした。 ただ、

  • ヒビが見える(透明なマテリアルを適用したときには特に)
  • 処理速度が遅い(Coliderの衝突判定が常に走るから)

の理由で、破壊前の板を用意しています。

Android MainActivityでClassNotFoundExceptionが出る。

Android Studioで実機テストしたときに、こんなエラーが出たときの自分の対処法。

とりあえずこうしたら動いた、的な記事なのであまり技術的なことに期待しないでください

08-14 16:32:02.973 22144-22144/com.gologius.infoclip E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gologius.infoclip, PID: 22144
java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.gologius.infoclip/com.gologius.infoclip.MainActivity}: java.lang.ClassNotFoundException: Didn't find class "com.gologius.infoclip.MainActivity" on path: DexPathList[[zip file "/data/app/com.gologius.infoclip-2/base.apk"],nativeLibraryDirectories=[/data/app/com.gologius.infoclip-2/lib/arm64, /vendor/lib64, /system/lib64]]
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2420)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569)
at android.app.ActivityThread.access$900(ActivityThread.java:150)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:168)
at android.app.ActivityThread.main(ActivityThread.java:5885)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)

Caused by: java.lang.ClassNotFoundException: Didn't find class "com.gologius.infoclip.MainActivity" on path: DexPathList[[zip file "/data/app/com.gologius.infoclip-2/base.apk"],nativeLibraryDirectories=[/data/app/com.gologius.infoclip-2/lib/arm64, /vendor/lib64, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
at android.app.Instrumentation.newActivity(Instrumentation.java:1085)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2410)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2569) 
at android.app.ActivityThread.access$900(ActivityThread.java:150) 
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1399) 
at android.os.Handler.dispatchMessage(Handler.java:102) 
at android.os.Looper.loop(Looper.java:168) 
at android.app.ActivityThread.main(ActivityThread.java:5885) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687) 

Suppressed: java.lang.ClassNotFoundException: com.gologius.infoclip.MainActivity
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 12 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

経緯

別のノートPCで開発したプロジェクトファイルを、別のPCに移した際に発生

原因を調べる

原因としては、

  • AndroidManifest.xmlのアクティビティ名が間違っている
  • Andorid Private Libraryがエクスポートされていない

が考えられるそうです。ただ、Eclipseで開発している情報が多くて、そのまま適用、ということはできませんでした。 いろいろやってみましたが、どうもこれが原因ではなさそうです。

次に、adb install -r xxxx.apkでインストールすればとりあえず動く、という記事を見ました(ソース忘れました…たぶんStackOverflowです) やってみると、見事動きました。しかしAndroidStudioでは動かないので根本的解決にはなってない・・・

最終的な解決策

AndroidStudioでBuild->Clean Projectすれば治りました。 しかし原因は不明のまま・・・

Unity一週間ゲームジャム テーマ「夏」に参加しました

先月参加したゲームジャムに、もう一度参加しました。二回目です。 今回は

  • 前回の反省を生かす
  • 前回と違う技術を使う(追加する)

ということを目標にゲーム制作しました。

何を作るか決める

僕はまず何を使うかを決める派なので、テーマ「夏」から連想するものを出します。

・・・ビーチとカニとスイカが思い浮かびました。カニはモーション作るのだるそうなので却下。 ここからさらに、前作ったガンダムバルバトスから「潰す」を連想しました。

そしてスイカを潰すゲームを作ろうと決めました。 後から調べたらネタかぶり多かったけどね。

プレイヤーは日焼けした兄さんがよいなと思ったので、MakeHumanというソフトで作成しました。 なんかポリ数が多そうだったので、Mesh Compressionで圧縮してます。 f:id:gologius:20170730150335p:plain https://docs.unity3d.com/ja/540/Manual/FBXImporter-Model.html

ガリガリ作る

前回の反省として

  • UIがアニメーションしない
  • ゲームのルールが分かりづらい

がありました。なので、今回はMecanimを勉強して組み込みました。 また、ゲームのルールも単純にしました。

二日目の進捗

完成

で、ロゴとか作ってこんな感じになりました。

www.youtube.com

ここから遊べるのでどうぞ https://unityroom.com/games/suika_crash

工夫点

Animatorでいろいろ動かした

タイトル画面、UI、ハンマーの動きなどです。Animatorについては後々記事を書こうかと思います。 ちょっと動かすだけでそれっぽくなるのでおススメです。

ただ、AnimatorControllerがどんどん増えていくのがなんか嫌だった。 AnimationClipを一つしか使用してないのに、Stateとかいちいち設定しないといけないのもなんか微妙。 アニメーションの順番指定(タイトルが動いて、そのあとボタンが・・・みたいな)も結局スクリプト書きました。

ここらへんの不満点はUnity 2017のPlayableやTimeLineを使えば改善されるっぽいので、今度使ってみたいです

爽快感

ハンマーの衝撃範囲を大きくしたり、潰した時の汁飛ばしとか残り汁とか。ParticleSystem万歳

感想と反省

前回よりはマシなものができた気がします。ただ、ハンマーを出現させると視界が悪くなるのでそこは残念。

反省としては、ゲームの雰囲気をおしゃれにできない?というのを思いました。 うまく説明できないんですけど、ライディングとか、全体の色?とかUIの配置、デザインはもっと改善の余地あるかなぁと思いました。

全然関係ないけど、今回の参加者が少ない気がした。学生の定期試験やスプラ2、ドラクエとかとかぶってたからかな?