問題
デフォルトだとParticleが常にカメラの方向に向く。
煙とかならよいが、壁のエフェクトを出したい、となると困る。実際困っている方がおられた。
[Unity] 頂点カラーを利用して平面メッシュをテクスチャアニメーションさせる - Qiita
解決策
「Render Alignment」を「Local」にしましょう(Unity環境は Version 2017.1.1f1)。 たぶん古いバージョンだと「Billboard Alignment」を弄ればよいと思われます。
デフォルトだとParticleが常にカメラの方向に向く。
煙とかならよいが、壁のエフェクトを出したい、となると困る。実際困っている方がおられた。
[Unity] 頂点カラーを利用して平面メッシュをテクスチャアニメーションさせる - Qiita
「Render Alignment」を「Local」にしましょう(Unity環境は Version 2017.1.1f1)。 たぶん古いバージョンだと「Billboard Alignment」を弄ればよいと思われます。
SphereCastやらRaycastやら調べたら色々ありました。
しかし私は新しくLayerを作るのが気に入らなかった。
Rigidbodyがアタッチされているなら、速度のy要素が(ほぼ)0になったとき、でよいのではなかろうか???
bool isGround = Mathf.Abs(rbody.velocity.y) < 0.001f ? true : false;
y要素が
となる。
これでよくね?
ずっと平面なら別にいいんだけど、坂道があったらこの前提は崩壊します。
素直にSphereCastとか使いましょうね
おしまい
Akeytsuで作成したfbxをUnityでimportした場合、一部の部位が消える場合の対処法です。
Akeytsuでモーション作成
Unityでインポートしたモーション
手がないですね
原因を説明する前に、このモデルの構造をお話しします。 実は、指にボーンは入っておらず、閉じた手(に武器)と開いた手の二種類(×左右の二つ)のモデルがあります。 それをスケールを1や0にすることで、表示非表示を切り替えています。
↓を見ると、閉じた手と重なった手が重なっていることが分かるかと思います。
Unityでインポートして、シーンに配置したときにモデルがやっているポーズ。 Akeytsuで出力したfbxだと、最初に作ったAnimationがデフォルトのポーズになるみたいです。
恐らくですが、デフォルトのモーション(ポーズ)で、スケールを0にしている部位があると、他のモーションで表示させようとすると見えなくなるみたいです。
↓のように、スケールが0の部位(この例だと閉じた手)があるポーズが、デフォルトのポーズだとダメ
Akeytsuで一番初めに作るポーズは、部位を全部Scale=1にしておきましょう。
そもそも、Akeytsuは最初はTポーズのScale=1ですし、Tポーズをとっている方がUnityでのインポート後の後処理が楽です。
結果から言うと完成しませんでした。 原因の考察は後程
前回同様に
というのをやっていこうと思いました。
フローと聞いて、水が思い浮かびました。凡人の発想ですね。 で、前回のこの作品が、メッシュを生成して頂点移動している話を思い出しました。
やまくずし | ゲーム投稿サイト unityroom - Unityのゲームをアップロードして公開しよう
頂点動かして、波発生させたりしたら面白そうだとおもいました。
とりあえずそれ作るか、ということで作った
ここで何を作るかきちんと決めなかったのが悪かった・・・
ソースは後日あげます(ゲームが完成してないのでせめてなにか残したい)
面白そうな挙動にはなったけどゲームとしての着地点が見えない #unity1week pic.twitter.com/mEc0velsrB
— ごろぎうす (@gologius) 2017年8月21日
お絵描きできるようになった #unity1week pic.twitter.com/jnYPEyD97w
— ごろぎうす (@gologius) 2017年8月21日
個人的には、見た目が結構面白いと思いました。なのでこれでゲーム作れたらいいなと思いました。
が、これに引きずられてアイデアが全く出てきませんでした。
Unityでこんな感じで画像を割ります。
ちなみに予め破片モデルを用意する方法です。なので、毎回割れ方は同じです。 有料Assetならもっといいのがあるのですが。
さっさとデータ欲しい、見たい人はこちら github.com
先に述べたように、予めモデルを作っておいて破壊時に散らかす方法です。
Debris
にRididbodyとColoderを設定した上で非表示(SetActive(false)
)にしておいて、スペースキーを押すと
Coliderのおかげで勝手に弾けて散らかる、という感じです。
GameObjectのDebris
の子要素に、破片用オブジェクトがないと、動かないので注意してください。
モデルはMetasequoiaで作成しました。
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
は使用していませんでした。
ただ、
の理由で、破壊前の板を用意しています。
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に移した際に発生
原因としては、
が考えられるそうです。ただ、Eclipseで開発している情報が多くて、そのまま適用、ということはできませんでした。 いろいろやってみましたが、どうもこれが原因ではなさそうです。
次に、adb install -r xxxx.apk
でインストールすればとりあえず動く、という記事を見ました(ソース忘れました…たぶんStackOverflowです)
やってみると、見事動きました。しかしAndroidStudioでは動かないので根本的解決にはなってない・・・
AndroidStudioでBuild->Clean Project
すれば治りました。
しかし原因は不明のまま・・・
先月参加したゲームジャムに、もう一度参加しました。二回目です。 今回は
ということを目標にゲーム制作しました。
僕はまず何を使うかを決める派なので、テーマ「夏」から連想するものを出します。
・・・ビーチとカニとスイカが思い浮かびました。カニはモーション作るのだるそうなので却下。 ここからさらに、前作ったガンダムバルバトスから「潰す」を連想しました。
Blenderでレンダリングした結果のバルバトス pic.twitter.com/HqxSbBac8I
— ごろぎうす (@gologius) 2017年7月16日
そしてスイカを潰すゲームを作ろうと決めました。 後から調べたらネタかぶり多かったけどね。
プレイヤーは日焼けした兄さんがよいなと思ったので、MakeHumanというソフトで作成しました。 なんかポリ数が多そうだったので、Mesh Compressionで圧縮してます。 https://docs.unity3d.com/ja/540/Manual/FBXImporter-Model.html
前回の反省として
がありました。なので、今回はMecanimを勉強して組み込みました。 また、ゲームのルールも単純にしました。
二日目の進捗
スイカ割りではなくスイカ潰しをつくることにしました #unity1week pic.twitter.com/FoigeWtsO0
— ごろぎうす (@gologius) 2017年7月25日
で、ロゴとか作ってこんな感じになりました。
ここから遊べるのでどうぞ https://unityroom.com/games/suika_crash
タイトル画面、UI、ハンマーの動きなどです。Animatorについては後々記事を書こうかと思います。 ちょっと動かすだけでそれっぽくなるのでおススメです。
ただ、AnimatorControllerがどんどん増えていくのがなんか嫌だった。 AnimationClipを一つしか使用してないのに、Stateとかいちいち設定しないといけないのもなんか微妙。 アニメーションの順番指定(タイトルが動いて、そのあとボタンが・・・みたいな)も結局スクリプト書きました。
ここらへんの不満点はUnity 2017のPlayableやTimeLineを使えば改善されるっぽいので、今度使ってみたいです
ハンマーの衝撃範囲を大きくしたり、潰した時の汁飛ばしとか残り汁とか。ParticleSystem万歳
前回よりはマシなものができた気がします。ただ、ハンマーを出現させると視界が悪くなるのでそこは残念。
反省としては、ゲームの雰囲気をおしゃれにできない?というのを思いました。 うまく説明できないんですけど、ライディングとか、全体の色?とかUIの配置、デザインはもっと改善の余地あるかなぁと思いました。
全然関係ないけど、今回の参加者が少ない気がした。学生の定期試験やスプラ2、ドラクエとかとかぶってたからかな?