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とかで作って読み込んで
もっと広いマップを作りたいですね。

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



Unityで3D空間を自由に移動できるようにする2

前回まででサイコロの横にボタンを配置することができました。
今回はボタンを押すとサイコロを右に移動させたいと思います。

勝手に前進するようにしてたので
スタート関数で0にして歩かせないようにする。
//——————————————————
void Start () {
power = 0.0f;
}
//——————————————————

右に移動させる関数を書く。
前進のときはtransform.forwardだったので
そこをtransform.rightにすれば良いのだろう。
//——————————————————
//右移動
public void RightButton()
{
power = 50.0f;
float walkSpeed = Mathf.Abs(this.GetComponent().velocity.x);
if (walkSpeed < this.maxSpeed) { this.GetComponent().AddForce(transform.right * 1 * this.power);
}
}
//——————————————————


書けたら保存してボタンと関数を接続して実行。
ボタンを押すと一瞬右に動くけどそれでおしまい。
また押しっぱなしを検知していない。

ボタンの押しっぱなしを検知する方法は
シューティングゲームの時にやったのでそれを使おう。

押しっぱなし検知の記事

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

public class SaikoroMover : MonoBehaviour {

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

// Use this for initialization
void Start () {
power = 0.0f;
}

// Update is called once per frame
void Update () {
if (Rnow == true)
{
power = 50.0f; //サイコロを動かすのに加える力。パワー。
float walkSpeed = Mathf.Abs(this.GetComponent().velocity.x); //歩く速度を計測。

if (walkSpeed < this.maxSpeed) //歩く速度(walkSpeed)が最高速度(maxSpeed)を超えないなら力を加えて加速させる。 { this.GetComponent().AddForce(transform.right * 1 * this.power);
}
}
}

//右移動
public void RightButton()
{
power = 50.0f; //サイコロを動かすのに加える力。パワー。
float walkSpeed = Mathf.Abs(this.GetComponent().velocity.x); //歩く速度を計測。

if (walkSpeed < this.maxSpeed) //歩く速度(walkSpeed)が最高速度(maxSpeed)を超えないなら力を加えて加速させる。 { this.GetComponent().AddForce(transform.right * 1 * this.power);
}
}

//Rボタン押した
public void Rosita()
{
Rnow = true;
}

//Rボタン離した
public void Rhanasita()
{
Rnow = false;
this.GetComponent().velocity = Vector3.zero; //停止させる命令

}
}
//————————————————————-


これでサイコロがスムーズに右に移動
できるようになったぞ^^v

後はボタンの位置と大きさを調整して
左、前、後ろ移動用のボタンを作ればいけそうですな。^0^

ボタンのSourceImageも半透明にすると見やすいかも。

とりあえず今回はこれでおしまい~ 

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



Unityで3D空間を自由に移動できるようにする1

前回まででサイコロを真っすぐ歩かせることができました。

今回はプレイヤーがサイコロを自由に動かせるようにしたいと思います。

ボタンを配置してボタンを押すとサイコロを右に移動させるようにしたいと思います。

create→UI→Button でボタン配置。
名前をRbuttonにしました。


2Dの時はcanvasのRender ModeをScreenSpace-cameraにしてたけど
3Dにするとなんかうまくいかない。
World Spaceにすると座標位置を設定できたので
ポジションを5,5,0にしてサイコロの近くに表示してみる。


ボタンの大きさと位置もこんな感じにすると
サイコロの近くにボタンが来た。


実行してみる。
ボタンは表示できているが
サイコロくんはどんどん前に進んで行くので
ボタンは置いてけぼりになって画面から消える(ノ∀`)

置いてけぼりにならないように
サイコロを追いかけさせれば良いのだろう。
スクリプトを書く。
Create→C#script
名前をUImoveにしました。
//——————————————————–
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class UImove : MonoBehaviour {

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

// Use this for initialization
void Start () {

this.UIninja = GameObject.Find(“saikoro”); //saikoroオブジェクトを見つけて代入。実体化。

}

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

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

//サイコロの動きに合わせてボタンの座標を更新する。サイコロの左に配置するのでx-3にした。
transform.position = new Vector3(playerpos.x-3, playerpos.y, playerpos.z);

}
}
//——————————————————–

書けたら保存してヒエラルキービューのRbuttonにD&Dで
アタッチする。


実行してみる。
移動するサイコロの隣にボタンがずっとついてきていますね。
ボタンの他にも2Dマップを表示させたまま移動とかできそう。

次回はこのボタンを押すとサイコロを
右に移動させるようにしますよ^0^

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



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^

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