unityで3Dオブジェクトをちゃんと歩かせる

前回まででオブジェクトのサイコロを地面に立たすことには
成功したのですが、歩かせようとすると
地面につまづいて転倒し体を回転させながら吹っ飛んで行くという
見事な歩行術を見せてくれたのでした。

こんなにすぐコケるのでは話にならないので
調べてみるとすごい簡単な解決策がありました。


Rididbody のインスペクタープロパティの
Constraints→ Freeze Rotation のXYZにチェックを入れる。
たったこれだけのことで


あのサイコロくんが安定感抜群の歩行を開始したのです。ヘ(゚∀゚*)ノ
苦労して車輪のようなコライダーを付けたのがアホみたいです。

次はこのサイコロをカメラに追いかけさせて
視界から消えないようにしたいと思います。
オブジェクトを追いかけるカメラの設定方法は
前に忍者アクションゲームでやったのでそれを流用します。
↓この記事

Unityでアクションゲームのカメラを動かす

プロジェクトビューで右クリック→Create→C#Script
名前をCameraMoveにしました。

//——————————————
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour
{

GameObject ninja; //ゲームオブジェクト型変数ninjaを宣言。

// Use this for initialization
void Start()
{
this.ninja = GameObject.Find(“saikoro”); //saikoroオブジェクトを見つけて代入。実体化。

}

// Update is called once per frame
void Update()
{

//playerposに現在のサイコロのx,y,z座標を代入
Vector3 playerpos = this.ninja.transform.position;

//サイコロの動きに合わせてカメラの座標を更新する。サイコロの後方から撮影するためz-10にしている。
//zのままにするとサイコロより前面を映すのでパイロットのコックピットのような映像になるのでこれはこれで使えそう。
transform.position = new Vector3(playerpos.x, playerpos.y, playerpos.z-10);
}
}
//——————————————

書けたらヒエラルキービューのMain CameraにD&Dでアタッチします。
実行してみよう!


おおー
サイコロをカメラが追いかける迫力の映像だ!(・∀・)

しかしどこまでも加速するのですぐに地面の端まで行ってしまうな。
カーレースゲームではええかもしれんけど
もっと普通に歩かせたいのですよ。
速度制限するようにスクリプトを書き換える。

//———————————————————–
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SaikoroMover : MonoBehaviour {

float power = 50.0f; //サイコロを動かすのに加える力。パワー。
float maxSpeed = 7.0f; //最高速度を指定して速度制限。これをしないとずっと加速し続ける。

// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
float walkSpeed = Mathf.Abs(this.GetComponent().velocity.z); //歩く速度を計測。
if (walkSpeed < this.maxSpeed) //歩く速度(walkSpeed)が最高速度(maxSpeed)を超えないなら力を加えて加速させる。 { this.GetComponent().AddForce(transform.forward * 1 * this.power);
}
}
}
//———————————————————–

書けたら実行するぜ! ^0^


あ~ これこれ
やっと思い通りにサイコロくんを歩かせることができましたよ!
感無量です (*^▽^*)

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



unityで3Dオブジェクトを動かす

前回までで歩くフィールドができたので
今度はその上を歩けるようにしたいと思います。


サイコロのオブジェクトをシーンビューにD&D。
これをプレイヤーに見立てて移動させましょう。


シーンを再生してみると あれれ
カメラがサイコロしか映していない。
いやいや・・・そうじゃないでしょ・・・


ヒエラルキービューでサイコロを見てみると
なんか独自のカメラを持ってるね。
Blenderでオブジェクトを出力するとカメラがくっついてくる?
よくわからん・・・
とりあえず赤丸のカメラのチェックを外してみる。


チェックを外すと思い通りの映像になったぞ ^0^
なんかシュールですけど


このオブジェクトに物理演算を付けると地面に落ちるから
Transformのscaleのzを400にして人くらいの高さにする。


物理演算で重力に従って動かせるように
Rigidbodyを使います。
Add Component → Physics → Rigidbody


地面とか他のオブジェクトとの当たり判定用に
コライダーを付けます。
sizeを2,8,2にするとサイコロのサイズにフィットしました。
さあ地面に着地できるか実行してみよう!(・∀・)


あら・・・?


倒れたー (ノ∀`)あっはっは
立て! 立つんだ サイコロォォーー!!


転ばないようにこういう風に車輪のような足を付けてやりました。
丸型のコライダーはSphere Colliderで付けられるよ。

それと縦長だと安定性に欠けるのでサイコロの長さを半分にしました。

さて、これで立てるかな? 実行してみよう。(・∀・)


傾いているけど今度はコケませんでした!
やった ^0^

次はこの子を動かすスクリプトを書きます。
プロジェクトビューで右クリック→Create→C#Script
名前をSaikoroMoverにしました。

//——————————————
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SaikoroMover : MonoBehaviour {

public void Movement(Vector3 dir)
{
GetComponent().AddForce(dir);
}
void Start () {
Movement(new Vector3(0, 0, 500));
}
}
//——————————————

書けたらヒエラルキービューのsaikoroにD&Dでアタッチします。
実行してみると・・・?


盛大に吹っ飛んで行きましたわ(ノ∀`)あっはっは

これはちょっと対策を考えないといけないですね・・・ ^^;

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



Unityで3Dゲーム制作に挑戦してみる1

Unityで3Dゲーム制作に挑戦してみることにします。

やりたいことは3D空間を自由に移動することです。


Blenderというソフトで配置するオブジェクトを作ってFBX形式で出力します。
Blenderを使うのは初めてでサイコロは解説サイト見ながら作りました。
木は適当に立方体と円錐形を組み合わせただけ。


ファイルをプロジェクトビューにD&Dで登録しておく。
このサイコロをプレイヤーに見立てて移動させたいと思います。
木は衝突判定に使いたいと思います。


地面を作ります。
create → 3D Object → Terrain


操作の矢印がどっか行ったので赤枠のCenterをクリックしてPivotにする。


矢印さんこんにちは


ALTキー押しながらマウスドラッグして視点を回転させて
矢印が手前にくるようにする。
インスペクタのPositionを -256,0,-256 にする。


Terrainの中心部分が原点に移動した状態。


カメラを選択するとカメラが映す方向が分かるので
その範囲内の地面に起伏を付けたいと思います。


ヒエラルキービューのTerrainを選択して
インスペクタビューの赤丸のRaise/Lowerボタンをクリック。
シーンビューをマウスでドラッグすると地面が盛り上がります。
盛り上げる範囲は青枠のBrush Sizeで調整します。
Opacityは盛り上げる強さかな? 数値を上げると高く盛り上がりましたよ。

やばい盛り上げすぎたって時は
SHIFTキー押しながらドラッグするとへこみます。


地面に草のテクスチャを張り付けましょう。
Assets → Import Package → Environment


TerrainAssets の SurfaceTexturesいうのが草のテクスチャらしいので
選択して Importをクリック。


赤丸部分をクリックして
黄色枠のEdit Textures → Add Texture


赤丸のSelectをクリック
青枠のGrassHillを選択。
黄色枠のAddをクリック。


地面に草が生えましたよ ^^v


シーンを実行してみるとこんな感じに。
3Dゲームっぽいですな!


今度は地面に木を生やしてみたいと思います。
Assets → Import Package → Environment


Broadleafいうのが木のテクスチャらしいので
選択して Importをクリック。


赤丸をクリックして
青枠のEdit Tree → Add Tree


赤丸をクリック
青枠のBroadleafMobileを選択
黄色枠のAddをクリック。


あとはマウスでドラッグすると木がボンボン配置されます。
Brush Sizeで木を生やす範囲を設定できます。
Tree Densityで木を生やす密度を設定できます。


シーン再生。ちょっと視点が下すぎかな?


カメラを選択してインスペクタビューのPositionを 0,5,-10 にする。
おー
3D RPGの画面みたいになってきましたよ! ^0^

ー広告ー



Unityでシーン間を移動する

前回までで忍者を移動させて物体との当たり判定を行うことができました。

今回は宇宙船に触れると次のステージに飛ぶようにします。

1.
次のステージを作ります。
File → New Scene
名前をStage2 にして保存しました。

2.
適当にブロックPrefabをD&Dしてステージを作る。

3.
GameSceneをダブルクリックで開いてNinjaMoveスクリプトに以下を追加。

冒頭に
using UnityEngine.SceneManagement;

宇宙船との当たり判定の処理のところに

//ship1との当たり判定
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == “nextstage”)
{
Debug.Log(“GOOD”);
SceneManager.LoadScene(“Stage2”); //←追加
}

}

4.
Build Settingでシーンの登録をしないといけないらしい。
File → Build Settings…

プロジェクトビューのGame SceneとStage2を上の欄にD&D。
これで登録完了~

5.
実行してみるぜ!

やったー
宇宙船に触れるとステージ2に移動できました!

次はステージ2からステージ1に戻れるかやってみました。
6.
ステージ2に配置する忍者をPrefabで作成する。
ヒエラルキービューのstandをプロジェクトビューにD&DしてPrefab作成。

7.
ステージ2のシーンに忍者のPrefabをD&Dで配置。
触れるとステージ1に戻る青い四角の画像をD&Dで配置。

8.
この青の四角オブジェクトにステージ1の宇宙船と同じように当たり判定を設定する。
Add Component → Physics2D → Box Collider2D
インスペクタビューのIs Trigger にチェックを入れる。
beforestageというタグを付ける。

9.
今度は忍者側。
NinjaMoveスクリプトの宇宙船との当たり判定の場所に以下を追加。

//ship1との当たり判定
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == “nextstage”)
{
SceneManager.LoadScene(“Stage2”); //ステージ2へ
}

if (other.tag == “beforestage”)//追加部分。
{
SceneManager.LoadScene(“GameScene”); //ステージ1へ
}

}

10.
実行してみる。

宇宙船に触れるとステージ2へ。
青い四角に触れるとステージ1へ。
バッチリ移動できたぜ!^0^

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



UnityのPhysicsで当たり判定を検出する

前回で忍者を走らせて画面をスクロールさせることができました。

今回はプレイヤー以外の物体に触れたときに
当たり判定を検出できるようにしたいと思います。
この物体に触れたときに次のステージに進めるようにしたいです。

1.
シューティングゲームで使った宇宙船を使いまわします^^;
画像をプロジェクトビューにD&Dで登録して
シーンビューにD&Dして配置します。

次に宇宙船に当たり判定の枠を設置します。
Add Component → Physics2D → Box Collider2D

2.
インスペクタビューのIs Trigger にチェックを入れる。

3.
この宇宙船に触れたことを検出するためにタグを付けておく。
インスペクタビューのTag → Add Tag..

List is Emptyの + をクリックして新しいタグを作る。
次のステージに進むオブジェクトなので
nextstage という名前にしました。

再度ヒエラルキービューのship1を選択しTagをクリックすると
さっき作ったnextstageタグがあるのでこれを選択。
これで宇宙船側の衝突設定は終了。

4.
今度は忍者側の設定をする。
nextstageタグの宇宙船に触れると
goodという文字をデバッグエリアに表示します。

スクリプトNinjaMoveのUpdate関数外に追加。

//ship1との当たり判定。 Update関数内に書くとエラーな
void OnTriggerEnter2D(Collider2D other)
{
if (other.tag == “nextstage”) //もしnextstageタグの物体に触れると
{
Debug.Log(“GOOD”); //GOODという文字列表示
}

}

5.
実行してみよー

うむ!
宇宙船に触れるとGOODの文字が出たー^^v

試しにnextstageと違うタグを指定してみたら
GOODの文字が出なかったのでちゃんとタグの判別もできてるね。

if (other.tag == “nextstage”)

if (other.tag == “hogehoge”)

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



Unityでアクションゲームのカメラを動かす

前回で忍者にアニメーションをつけることができました。
今回はステージを作って忍者の動きに合わせて
カメラを移動して横スクロールさせたいと思います。

1.
ブロックのPrefabを配置してステージを作ります。

2.
カメラを動かすスクリプトを書く。
プロジェクトビューで右クリック → Create → C#Script
名前をCameraMoveにしました。

//////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour {

GameObject ninja; //ゲームオブジェクト型変数ninjaを宣言。

// Use this for initialization
void Start () {
this.ninja = GameObject.Find(“stand”); //standオブジェクトを見つけて代入。実体化。

}

// Update is called once per frame
void Update () {

//playerposに現在の忍者のx,y,z座標を代入
Vector3 playerpos = this.ninja.transform.position;

//忍者の動きに合わせてカメラのx座標を更新する。y,z座標はそのまま。
transform.position = new Vector3(playerpos.x, transform.position.y, transform.position.z);
}
}
///////////////////////////////////////////////////////

3.
できたスクリプトをヒエラルキービューのMain CameraにD&Dしてアタッチする。

4.
実行してみる。

カメラが忍者を追いかける!
横スクロールでステージの端まで行けましたー^^v

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



UnityのMecanimを使ってアニメーションさせる

前回で忍者が移動できるようになったので
今回は歩いたりジャンプしたりしたときに
アニメーションするようにしたいと思います。

UnityのMecanimというのを使うとアニメーションさせることができるようです。

1.
ヒエラルキービューでstandを選択して
ツールバーの Window → Animation

2.
アニメーションウインドウが出てくるのでCreateボタンをクリック。
Walkという名前で保存する。

3.
AddProperty → Sprite Renderer → Sprite +

4.
デフォルトでは1秒のアニメーションになってるので
↓この部分をdeleteキーで削除する。

5.
アニメーションさせたい画像をプロジェクトビューからD&D。
0.07秒ごとに違う画像を配置しました。

6.
タイムラインの0.28秒を選択して右クリック → Add Keyframe
で再生時間を0.28秒に設定。

7.
今度はスクリプトのNinjaMoveに記述して忍者が動くようにする。

MonoBehaviour の下に以下を追加。

Animator accessAnim; //AnimatorコンポーネントにアクセスするAnimator型変数accessAnimを宣言。

8.
Start関数内で

this.accessAnim = GetComponent(); //Animator関数にアクセスして実体化

9.
Update関数内で

//アニーメーション速度調整
this.accessAnim.speed = WSPD / 2.0f;

10.
実行してみる

忍者が走る!
だいぶゲームっぽくなってきたかも ^0^

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



UnityでRigidbodを使ってキャラを左右に動かす

前回は忍者をジャンプさせることができたので
今回は左右に移動できるようにしたいと思います。

前回のスクリプトに追加していきます。

1.
MonoBehaviourの下に以下を記述。

float walkPow = 40.0f; //歩く力を設定。
float maxWSPD = 3.0f; //スピードの最大値を設定。

2.
Update関数内に以下を追加。

int key = 0; //キー状態を保存する変数keyを宣言

if (Input.GetKey(KeyCode.RightArrow))
{
key = 1; //右が押されたらkey=1
}

if (Input.GetKey(KeyCode.LeftArrow))
{
key = -1; //左が押されたらkey=-1
}

//歩くスピードを設定。
//Mathf.Abs()は絶対値を返す。
//velocityには速度が入っている。
//したがってWSPDには速度の絶対値が代入される。
float WSPD = Mathf.Abs(this.access2D.velocity.x);

//キーを離してもすぐに停止しないで慣性の法則でしばらくそのまま動いてしまうので
//キーを離したらすぐに停止する処理。
if (Input.GetKeyUp(KeyCode.RightArrow))
{
this.access2D.velocity = Vector2.zero; //停止させる命令
}

if (Input.GetKeyUp(KeyCode.LeftArrow))
{
this.access2D.velocity = Vector2.zero; //停止させる命令
}

if (WSPD < this.maxWSPD) //マックススピード以下なら移動を加速させる。 { this.access2D.AddForce(transform.right * key * this.walkPow); }


//動く方向にキャラが向くように画像を反転させる処理
if (key != 0)
{
transform.localScale = new Vector3(key, 1, 1);
}



3.
実行してみる。

縦横無尽に駆け巡る忍者。
ブロックに飛び乗ることもできるようになりました! ^0^

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



UnityでRigidbodを使ってキャラを動かす

今回はキャラをジャンプさせたり左右に移動させたりします。

足場がブロック1個では移動できないので
ブロックのPrefabを作って配置します。

ヒエラルキービューからblockをプロジェクトビューにD&Dして
名前をblockPrefabにしました。
これをシーンビューにD&Dして配置していきます。

1.
スペースキーで忍者をジャンプさせるスクリプトを書く。
プロジェクトビュー内で右クリック → Create → C#Script
名前をNinjaMoveにする。

2.
MonoBehaviour の下に

//Rigitbody2DコンポーネントにアクセスするRigitbody型変数access2Dを宣言。
Rigidbody2D access2D;

//ジャンプの高さを設定。
float jumpPow = 430.0f;

3.
Start関数内に

//Rigidbody2D関数にアクセスして実体化
this.access2D = GetComponent();

4.
Update関数内に

//スペースキーが押されたら
//上方向にジャンプパワーをかけて動かす

if (Input.GetKeyDown(KeyCode.Space)) {
this.access2D.AddForce(transform.up * this.jumpPow);
}

5.
プロジェクトビューのNinjaMoveを
ヒエラルキービューのStandにD&Dしてアタッチする。

6.
インスペクタビューのGravity Scaleを2にして
少し落ちるスピードを速くする。

7.
実行してみよう

よしよし
スペースキーを押すとちゃんとジャンプしているな^-^
えらいぞ忍者。

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



Unityで横スクロールアクションゲームっぽい何かを作る

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

Unityで横スクロールアクションゲームっぽい何かを作ります。

キャラクターのアニメーションや当たり判定など
Unityの基本を勉強したいと思います。

忍者が好きなので忍者ゲームにしてやろう。ウハハ!

足場ブロック、背景の空、ジャンプアニメーション用画像3枚、普通の立ち絵1枚を用意。
プロジェクトビューのAssetsにD&Dします。

今回はPhysicsという物理エンジンでキャラを動かしたいと思います。
Rigidbodyというコンポーネントでキャラに重力の法則に則った動きをさせます。

1.
プロジェクトビューから立ち絵の画像をD&D。

2.
Add Component → Physics 2D → Rigidbody 2D

3.
実行してみる。

あっはっは
どこまでも落ちていくw

下に足場ブロックを置いてそこに着地できるようにしたい。
そこでキャラと足場ブロックに当たり判定を設定します。
当たり判定を扱うコンポーネントはCircle Collider 2Dを使うようです。

4.
Add Component → Physics 2D → Circle Collider 2D

5.
キャラが緑の円に囲まれますがこれが当たり判定になります。
Radiusは円の半径、Offsetは円の中心をどれだけずらすかを設定します。
Radius=0.15 , Offset=0,-0.3 に設定しました。

ConstraintsのFreeze Rotation にチェックをいれておくと
キャラが不用意に転倒するのを防止できるそうなのでチェックを入れておく。

6.
足元の当たり判定ができたので次は上半身の当たり判定を設置する。
上半身は四角い箱状のものを使用します。
Add Component → Physics 2D → Box Collider 2D

7.
四角の大きさを調整します。
Sizeを 0.3 , 0.6 にしました。
これでキャラが当たり判定にきれいに収まりました。

8.
次に足場になるブロックを配置します。
プロジェクトビューからブロックの画像をD&D。

9.
ブロックにもキャラと同じように
RigidbodyとBox Colliderを設定します。

Add Component → Physics 2D → Rigidbody 2D

ブロックは固定なので重力計算いらんやろ 思うたけど
衝突する両方のオブジェクトにそれぞれRigidbodyとColliderが必要らしい。
で、ブロックが下に落下するのを防ぐために
Body Type で Kinematic を選択しておく。

10.
次にブロックの当たり判定Colliderの設定。
キャラと同じように
Add Component → Physics 2D → Circle Collider 2D

これは何もしなくても当たり判定がブロックにフィットしてたので
楽ちん ^^v

11.
では実行してみよう~

やったー
立った 立った! 忍者が立ったー! ヘ(゚∀゚*)ノ

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