buttonのPrefabを表示するのに苦労した話




こんな感じでSTARTボタンを押したらゲームがスタートするようにしたかったんです。そのボタンをPrefabで作ろうとしたらいろいろエラーが出て苦しみました・・・

まずボタンが表示されませんでした。

なんでかというとボタンとかテキストはCanvasの子オブジェクトにしてやらないと表示されないようです。ボタンのPrefabのBTstartはCanvasの外にできちゃってます。これはアカン。

いろいろ調べてCanvasの子オブジェクトとしてPrefabを作る方法を発見。

これでいけるはずなんですが・・・

こんなエラーを吐かれてしまう。

UnassignedReferenceException: The variable canvas of MainJ has not been assigned.
You probably need to assign the canvas variable of the MainJ script in the inspector.

はぁ~ん? 何を言っとるのかわからんのう~

Canvasが見つからないのかと思ってFindで見つけようとか訳のわからんことをしてみる。

すると今度はこんなエラーを吐きだしたのでった。

Setting the parent of a transform which resides in a prefab is disabled to prevent data corruption.

どうもこれはPrefab自身を親オブジェクトに設定しようとすると出るエラーらしい。

なんかよくわからんけど私のPrefabの作り方がおかしかったぽい。

このように書くと

ちゃんとCanvas内にクローンが作れて

やっとボタンを表示することができました^0^

すごい基本的なことなのかな~?

やっぱ独学はアカンね・・・^^;

↓こういうところで本格的に勉強したいですな!




Collider Materialのbouncinessをスクリプトから変更する




こういったスロープ状のオブジェクトの上にボールを転がす時

Bouncinessを0.9くらいに設定しているとスロープ内で反射しまくります。

スロープの上にいるときはBouncinessを0にして反射させずにスルスルとボールを転がしたいのですよ。

反射させないオブジェクト用にNotReflecというタグを新しく作ります。

スロープオブジェクトのPlane.002にNotReflecタグを設定。

スクリプトの衝突判定処理内に上記を追加。

実行してみるとスロープの壁に反射せずにスルスルとボールが上がっていきます。やった^^

注意点としてはこの方法では反射させない障害物にぶつかっても
最初の1回は反映されずに反射してしまうようです。
2回目の衝突からは反映されて反射しなくなるみたい。

それと一度bouncinessを0にするとその後もずっと0のままなのでスロープを抜けるとまた0.9にしたい。

最初の行で0.9fに設定しておいてNotReflecタグの時だけ0にするようにしました。

するとスロープを抜けたら壁に反射するようになりました!

最短4週間!オリジナルのゲームアプリを開発しよう!




unityでオブジェクトが壁をすり抜けてしまう問題について





ブレンダーでこういうスロープ状のデッキを作って

その上にボールを転がそうとしたら

左のカーブ部分で

壁をすり抜けしまう問題発生 ^^;

ボールオブジェクトのRigidbody のCollision Detectionを

DiscreteからContinuous

に変更すると

すり抜けなくなりました! やった ^0^




Shader for this material does not support skybox renderingのエラーが出た

こういう画像をゲームの背景に使おうとしたらエラーが出ました。

あ、この写真はエスカヒル鳴門っていうきれいな場所です。^^

新しくマテリアルを作ってShaderに

Legacy Shader→Diffuse を選択。

Window  Rendering  Lighting Settings で

Shader for this material does not support skybox renderingのエラー。

マテリアルのShader → SkyBox → Panoramic

を選択すると解決しました。^-^

パノラマですね~ ^0^

////////////////////////////////////////
ー広告ー



Blenderで作ったオブジェクトをUnityで動かす2

前回まででブレンダーで作ったキャラの左腕をあげることができました。

今回はボタンを押したら腕をあげるようにしたいと思います。

create → UI → Button

でボタンを2つ作成。名前をLeftButton、RightButtonにしました。LとRのボタンを上の図のように配置します。

Lボタンを押すと左腕をあげさせます。

今はシーンを再生すると自動的に左腕をあげるアクションをするようになっています。ボタンを押したときに動かすにはトリガーを設定すると良いそうです。

プロジェクトビューのアニメクリップをダブルクリックしてアニメータービューにしてParameters タブの+をクリック。Triggerを選択します。名前をLeftTriggerにしました。

StandからLeftUpを繋ぐ矢印を選択してインスペクターのHas Exit Timeのチェックを外します。Transition DurationとTransition Offsetの値を0にします。

Conditionsの+をクリックしてLeftTriggerを選択します。

トリガーを設定したので自動的に左腕をあげなくなりました。^-^

次にボタンを押したときにトリガーを引くようにスクリプトを書きます。Create→C#Script

create Empty で空のオブジェクトを作ってゲーム監督にします。名前をKantokuにしました。書けたスクリプトをこれにD&D。次にLeftButtonのOnClickの+押してobjectの欄にKantokuをD&D。関数の欄にさっき書いたスクリプトのPushLを選択します。

実行してみるとLボタンを押すとちゃんと左腕をあげました!やった^^v

ただこのままだとずっと左腕をあげたままになります。腕をあげたらまた元の直立Stand状態に戻したいと思います。

LeftUpのアクションを選択してMake Transitionで矢印をStandに接続。矢印を選択してHas Exit Timeにチェックを入れる。Exit Timeを0、Transition Durationを0.5、Transition Offsetを0に設定。

ボタンを押すと1回左腕をあげてその後はゆっくりと元のStand状態になりました! ^0^

なんかどれもすんなり成功してびっくり。

やる前にいろいろ読んでたらなんか難しそうだなーって思いましたが実際やってみると意外と簡単に動かせました!(^∇^)

 

////////////////////////////////////////
ー広告ー



Blenderで作ったオブジェクトをUnityで動かす1

Blenderで作ったオブジェクトをUnityで動かそうと思います。

やりたいこととしてはAというボタンを押せば左腕を上にあげるアクションをさせる。Bというボタンを押せば右腕を上にあげるアクションをさせる。というようなことをやりたいのです。

そのためにまず

ただ立っているだけのアクション1

左腕を上にあげるアクション2

右腕を上にあげるアクション3

の3つのアクションをブレンダーでまず作ります。

上のDefaultって所をAnimationに切り替える。

ドープシートをアクションに切り替えてアニメーション終了時間を20にする。

ただ立っているだけのアニメーションを作ります。

腕を下げて全部のボーンを選択した状態で iキーでメニューを出して 位置/回転を選択。

キーフレームが作成されました。

Fボタンを押すと横に2って数字が出るのでそれを押すとArmatureAction.001とかいうのが出来るのでそれをStandという名前にリネーム。

次に左腕を上げるアクションを作ります。

F ArmatureActionを選択して数字の2を押すとまたArmatureAction.001とかいうのが出来るのでそれをLeftUpという名前にリネーム。

グラフエリアで10フレーム目にカーソルを移動して左腕を上げている状態で iキー → 位置/回転 でキーフレーム作成。左腕を上げるアクションができました。

同じように右腕を上げるアクションをRightUpという名前で作りました。

これでStand、LeftUp、RightUpの3つのアクションができました。

FBX形式でエクスポートします。

今度はUnityでこれを読み込んで動かしたいと思います。

fbxファイルをプロジェクトビューにD&D。

インスペクターのRigでHumanoidを選択してApplyをクリック。

読み込んだキャラをシーンビューにD&D。

無事読み込めて一安心。^-^

おいおい

ハゲとるやないけww あっはっは (^▽^)

まあハゲはあとで修正すればよろし。

ヒエラルキーでオブジェクトを選択してからWindow → Animationをクリック。

こんな画面が出てくるのでCreateで適当な名前のアニメーションクリップを作成保存。

さっき作ったクリップをダブルクリックするとこんなアニメーション同士の繋がりを設定できる画面が出てきました。

プロジェクトビューからStandのアクションをD&Dします。

最初からあるNewStateとかいうのは右クリックでDelete。

すると自動的に矢印がStandアクションに繋がりました。

シーン再生してみるとちゃんとただ立っているだけのアクションをしているな。ヨシヨシ^-^

今度はLeftUpのアクションをD&D。

Standを右クリックしてMake Transitionを選択すると矢印が出てくるのでLeftUpアクションと連結させる。

おおー 左腕を上げた!思い通りに動くとうれしいぜ!(・∀・)

次回はボタンを押すと腕が動くようにしたい!

 

////////////////////////////////////////
ー広告ー



UnityでCSVファイルを読み込んでマップ作製2

前回まででCSVファイルのマップデータをUnityで
読み込むことができました。
今回は読み込んだデータからオブジェクトを
配置していきたいと思います。

長々とした美しくないコードができてしまったよ。
もっとスマートなやり方があると思います。

実行結果↓

まあまあ思ってた感じに配置できているような
気がしますな。
石の高さが低いので遺跡の中には入れないけど
高さを調整したら入れそう。

なんか例外エラーが出てたので
try~catchいうのを初めて使いました。
何事も挑戦だ! 失敗したらcatchでbreakだ!

////////////////////////////////////////
ー広告ー



UnityでCSVファイルを読み込んでマップ作製

前回までで二つのオブジェクトをマップに配置できました。
今回はCSVファイルにマップデータを保存して
Unityで読み込んでオブジェクトを配置したいと思います。


このような10×10マスのマップデータを
CSV形式で保存しました。

0は何も配置しない場所。
1は木を配置する場所。
2は石を地面に配置する場所。
3は石を空中に浮かせて屋根のように配置します。
99は二桁の文字列も読み込めるかのテストです。

このマップのイメージとしては
木に囲まれた石の遺跡みたいな感じです。


上記CSVファイルをAssetsのResourcesフォルダに
ぶち込んでおきます。

まずこのCSVファイルをUnityで読み込みます。

今回からソースコードを表示するプラグイン
Crayon Syntax Highlighter
を導入しました! \(^o^)/
少しは見やすくなったかな?

上のコードはカンマ区切りの文字列を
strという文字列型変数に読み込んでいます。

Debug.Logでstrの内容を表示するとこう

ここから数字を一つづつ配列変数に入れていきます。
文字列strから区切り文字のカンマ”,”を検索して
文字を取り出す位置と文字数を決定します。

文字列の取り出し方を勉強します。

例えばstrの内容がこのようだったとします。

まず最初の区切りカンマを検索します。
文字列を検索するのにはIndexOfを使うそうです。

strには最初(0番目)にカンマがあるので
実行すると iDat[0]には0が入ります。

次のカンマは先頭を0番目とすると3番目にあります。
iDat[1]には3が入りました。

ということは取り出す文字数は

でiDat[2]には2が入ります。2文字取り出すのです。

Substringで取り出す位置と文字数を指定して
strgetに保存。
strgetには文字列の37が入りました。

取り出した文字列を数値型に変換して
iDat[3]には数値の37が入りました。

これをマップの配列変数にぶち込んでいく予定です。

////////////////////////////////////////
ー広告ー



Unityでオブジェクトを配置してマップを作る2

前回は石のオブジェクトをマップに配置しました。
今回はブレンダーで作った木のオブジェクトを配置したいと思います。

Add Component → Physics → Rigidbody
Add Component → Physics → Box Collider

実行してみる


また倒れる (ノ∀`)


Freeze Rotationにチェックを入れると
倒れないことを学習したんだぜ


木にぶつかってみると
こ、こいつ動くぞ・・・
どこまでも押していける^^;

何かを押して動かすイベントには使えそうやけど
とりあえず木は動かないで欲しいので
今度はFreeze Positionにチェックを入れる。


するとなんということか。
木は固定されたけど今度はサイコロくんが
ぼよよ~んと跳ね返され
結構な距離を吹っ飛ばされワロタw
あっはっは (^▽^)

この演出もボールとかが障害物に跳ね返るイベントに
使えるような気がするが
とりあえず木! お前は普通の木になってくれ


Is Kinematic にチェックを入れると
物理演算を無効にできるみたいです。
ぶつかっても大丈夫。
普通の木になってくれました。^^v

前回の石のときはこんなことしなかったのにな、
って見てみると石は
Box ColliderだけでRigidbodyつけてなかったわ。
障害物にはRigidbodyつけんでええのか。

うんうん。
まあいろいろ動いて面白かったからいいや ^0^

次回は石と木の配置位置をCSVファイルで作って
それ読み込んで3Dマップを作ってみたい!

////////////////////////////////////////
ー広告ー



Unityでオブジェクトを配置してマップを作る

前回までで3D空間を自由に移動できるようになりました。
今回は石のオブジェクトのプレファブコピーを複数配置
してみたいと思います。

Create→3D Object→Cube
で新しい立方体オブジェクトを作ります。
名前をCubePreにしました。
PositionとScaleを図のようにして
MaterialsにStoneのテクスチャを選択しました。

プロジェクトビューにD&Dしてプレファブ化。
ヒエラルキービューのCubePreはDeleteする。

プロジェクトビューでcreate→C#script
名前をMapMakerにしました。
//———————————————-
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MapMaker : MonoBehaviour {

public GameObject MapObject; //設計図を入れる箱をGameObject型変数で宣言

// Use this for initialization
void Start () {
GameObject MapPut = Instantiate(MapObject) as GameObject; //Instantiate関数でCubePreのコピーを作る。

MapPut.transform.position = new Vector3(-5, 3, 8);

MapPut = Instantiate(MapObject) as GameObject;
MapPut.transform.position = new Vector3(0, 3, 8);

MapPut = Instantiate(MapObject) as GameObject;
MapPut.transform.position = new Vector3(5, 3, 8);

MapPut = Instantiate(MapObject) as GameObject;
MapPut.transform.position = new Vector3(5, 8, 8);

MapPut = Instantiate(MapObject) as GameObject;
MapPut.transform.position = new Vector3(10, 8, 8);
}
// Update is called once per frame
void Update () {
}
}
//———————————————-

Create Emptyで空のゲームオブジェクトを作る。
名前をMapKantokuにしました。
さっき書いたC#ScriptをMapKantokuにD&D。

MapKantokuのインスペクタビューのnoneって
なってるところにCubePreをD&Dして接続する。

では実行してみよー ^0^

プレファブコピーのCubePre(Clone)が
5こ作られてtransform.positionで指定した位置に
配置されました!
やったー ^^v

ちゃんと障害物として認識されているようで
ぶつかるとそれ以上進めないのです。

あとはマップファイルをCSVとかで作って読み込んで
もっと広いマップを作りたいですね。

////////////////////////////////////////
ー広告ー