C#
Unity3D
Unity
Unity2017
Unity2018

マリオカートの緑こうらっぽいのを作ろう【Unity3D】

Googleで「Unity 緑こうら」と調べてもUnityについての記事が見つからなかったので

今更ですがメモとして書きたいと思います。

(そもそも検索エンジンで出てこないということは調べてる人が少なすぎるということでこの記事の必要性低い?w)

3Dで進めていきます。2Dでも少し変えればできます。



オブジェクトの作成


キャラの作成

では早速始めていきましょう。

あるシーンに下の様にオブジェクトを作ってください。


  • Player (キューブ)

  • MidoriKoura (キューブ)

PlayerとMidoriKoura

MidoriKouraに緑色のマテリアルを付けました。

次にMidoriKouraにRigidbodyを追加してy座標を固定してください。

Angular Dragを0にし、Use Gravityのチェックを外します。

Angular Dragは空気抵抗です。0にした場合それが無くなります。

Use Gravityは重力の有無です。

MidoriKoura.Rigidbody

PlayerにもRigidbodyを追加します。値はそのままでいいです。

Player.Rigidbody


Physic Materialの作成

Physic Materialで摩擦や弾性などを設定できます。

Collider関連のコンポーネントにMaterialという項目がありますよね?

そこにアタッチするものです。

ProjectウィンドウでCreate -> Physic Material で作成してください。

名前は何でもいいです。

New Physic Material

New Physic Materialを選択してインスペクターから値を変えていきます。

画像のように設定してください。

Friction CombineはMinimum、Bounce CombineはMaximumであることに注意してください。

New Physic Material(Inspecter)

これをMidoriKouraBox ColliderにあるMaterialにアタッチしてください

MidoriKoura.BoxCollider.Material


ステージを作成

キューブオブジェクトでステージを作ってみました。

Stage

床となるStage、壁となるWallでステージを作っています。

これらのオブジェクトにはその他のコンポーネントを追加しなくても大丈夫です。


スクリプト

今回は、緑こうらの動きをするスクリプトPlayerを動かすスクリプトの2つを書きます。


Midorikouraの動きをするスクリプト

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class MidoriKouraMovement : MonoBehaviour
{
float speed = 1000;
void Start()
{
this.GetComponent<Rigidbody>().AddForce(transform.right * speed + transform.forward * speed);
}

private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.name == "Player")
{
Destroy(this.gameObject);
}
}
}

ゲーム起動時に右上にオブジェクトが押されるようにして、Playerに当たったときに消すだけです。

Playerのオブジェクトの名前が Player じゃない方は、

コード内の"Player"の部分をそのオブジェクトの名前に設定してください。

保存したらMidoriKouraにアタッチしてください。

そしてプレイしてみてください。

壁に跳ね返って動き回ると思います。

Playerに当たると消えると思います。

スピードが遅いと感じる方はspeedの値を上げてください。


Playerの動きをするスクリプト

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
private void OnCollisionEnter(Collision collision)
{
if(collision.gameObject.name == "MidoriKoura")
{
Destroy(collision.gameObject);
}
}
}

保存したらPlayerにアタッチしてください。

MidoriKouraが当たったらPlayerも消えるようにしただけです。



MidoriKouraが壁に10回当たったら消えるようにする

ここまでのスクリプトではMidoriKouraはPlayerに当たるまで永遠に動き回ります。

10回壁にあたったら消えるようにしましょう。


壁にタグを追加

今のステージでは、コンピュータからしてみれば床や壁の区別がついていません。

同じ扱いを受けています。

このままでは壁だけ反応させることはできません。

他に区別の仕方はあると思いますが、今回はタグを使って区別していこうと思います。

壁になっているオブジェクトを選択(CTRLキーで複数選択)して、Tag [Untagged] をクリックしてAdd tag...でタグを追加します。

Wall.tag

[+] をクリックしてWallというタグを作ってください。

Wallタグ作成

再びWallゲームオブジェクトを選択してWallを決定してください。

Wallタグ追加

これでWallを認識できました。


スクリプトの編集

MidoriKouraMovementをもう一度編集します。

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class MidoriKouraMovement : MonoBehaviour
{
float speed = 1000;
void Start()
{
this.GetComponent<Rigidbody>().AddForce(transform.right * speed + transform.forward * speed);
}

int count = 0;
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.name == "Player")
{
Destroy(this.gameObject);
}

if(collision.gameObject.tag == "Wall")
{
count += 1;
if(count >= 10)
{
Destroy(this.gameObject);
}
}
}
}

MidoriKouraが壁にぶつかるたびにcountを1増やし、

countが10以上になったとき消すようにしています。


スタートの方向をランダムにする

この状態ではMidoriKouraの力の方向は右奥になります。

これをランダムにします。

using System.Collections;

using System.Collections.Generic;
using UnityEngine;

public class MidoriKouraMovement : MonoBehaviour
{
float speed = 1000;
void Start()
{
this.GetComponent<Rigidbody>().AddForce(new Vector3(Random.Range(0, 361), 0, Random.Range(0, 361)) * speed);
}

int count = 0;
private void OnCollisionEnter(Collision collision)
{
if (collision.gameObject.name == "Player")
{
Destroy(this.gameObject);
}

if(collision.gameObject.tag == "Wall")
{
count += 1;
if(count >= 10)
{
Destroy(this.gameObject);
}
}
}
}

変えたのはStart()の中だけ変えました。360度の中から乱数で取得します。

その数字にspeedをかけて移動させています。

ここのspeedは異常に速いので最初のspeedを200で割ったくらいの数字がちょうどいいです。


終わりに

Qiitaどころか記事を書くのをあまりしたこと無いので分かりづらくてすみません。

誤字脱字・情報の誤りがあったらコメントしていただいたら幸いです。