gologiusの巣

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

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、ドラクエとかとかぶってたからかな?

Akeytsu IKの使用方法メモ

Akeytsuの使用方法メモです.日本語の情報が少ないので参考になれば幸いです. 使い始めてからまだ日が浅いので間違っていたらコメントお願いします.

事前設定

  • 左下が骨のアイコン(rigging mode)になっていること
  • 左上「CharaBank」が「Bind Pose」になっていること

IKの設定

Ctrlキーを押しながら,ボーンを二つ選択.選択すると,下の画像の赤枠内が黄色に光る. f:id:gologius:20170722110151p:plain

光っているボタンを押すと,IKボーンが追加される. f:id:gologius:20170722110300p:plain

モーションを作る

左下のボタンのボタンでモード切り替えができる. f:id:gologius:20170722110349p:plain

ここからがポイントなのですが,IKは元あったモーションには適用することができず,新しく作ったモーションから適用することができるみたいです. 下の画像で説明します. Runというモーションを新しく作ったとします.設定したIKはこのモーションでは使用することができます. しかし,元あったStandなどのモーションでは使用することができませんf:id:gologius:20170722110519p:plain

IK自体が使用できないのではなく,モーションを作成した時点で設定されているIKボーンしか使用できない,ということです. MMD使ったことないのでわかりませんが常識なのかな...?

Androidアプリ開発でToolbar(一番上のバー)の設定

f:id:gologius:20170708075209p:plain

一番上のバー(Toolbar)を編集しようと思って,どこをいじればいいのかわからなかったのでメモ.

開発環境(何を書けば...)

  • min sdk version 21
  • Compile sdk version : API26 : Android8.0
  • build tools version : 26.0
  • ActivityはMainActivity一つ

前提

  • ActivityはMainActivity一つ
  • アプリのテーマをxxxxx.NoActionbarにしている
  • デザイナなりxml直打ちなりでToolbarを挿入している
  • MainActivityのonCreate内に以下のような記述がある
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); //R.id.toolbarは各自で設定したidを入れる
setSupportActionBar(toolbar);

本題

MainActivity内に以下の関数を追加.これによりToolbar内によくみるアイコン付きボタンが表示される準備ができる.

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

次に,xmlファイルを作成する. 先ほどのmenu_mainxmlファイルの名前と(おそらく)同じ

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.gologius.infoclip.MainActivity">
    <item
        android:id="@+id/action_settings"
        android:orderInCategory="100"
        android:title="@string/action_settings"
        android:visible="true"
        app:showAsAction="never"
        tools:title="設定" />
    <item
        android:id="@+id/action_about"
        android:title="このアプリについて"
        android:orderInCategory="200"
        app:showAsAction="never" />

    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ic_search_black_24dp"
        android:title="search"
        app:showAsAction="always" />

    <item
        android:id="@+id/action_add"
        android:icon="@android:drawable/ic_menu_add"
        android:title="add"
        app:showAsAction="always" />
</menu>

・・・(縦)のアイコンには,app:showAsAction="never"にしたものが入る. なので,app:showAsAction="never"が一つもなければ・・・(縦)アイコンは表示されない.

たぶんこの解釈であっているはず.