Googleで「Unity 緑こうら」と調べてもUnityについての記事が見つからなかったので
今更ですがメモとして書きたいと思います。
(そもそも検索エンジンで出てこないということは調べてる人が少なすぎるということでこの記事の必要性低い?w)
3Dで進めていきます。2Dでも少し変えればできます。
オブジェクトの作成
キャラの作成
では早速始めていきましょう。
あるシーンに下の様にオブジェクトを作ってください。
- Player (キューブ)
- MidoriKoura (キューブ)
次にMidoriKouraにRigidbodyを追加してy座標を固定してください。
Angular Dragを0にし、Use Gravityのチェックを外します。
Angular Dragは空気抵抗です。0にした場合それが無くなります。
Use Gravityは重力の有無です。
PlayerにもRigidbodyを追加します。値はそのままでいいです。
Physic Materialの作成
Physic Materialで摩擦や弾性などを設定できます。
Collider関連のコンポーネントにMaterialという項目がありますよね?
そこにアタッチするものです。
ProjectウィンドウでCreate -> Physic Material で作成してください。
名前は何でもいいです。
New Physic Materialを選択してインスペクターから値を変えていきます。
画像のように設定してください。
Friction CombineはMinimum、Bounce CombineはMaximumであることに注意してください。
これをMidoriKouraのBox ColliderにあるMaterialにアタッチしてください
ステージを作成
床となる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ゲームオブジェクトを選択して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どころか記事を書くのをあまりしたこと無いので分かりづらくてすみません。
誤字脱字・情報の誤りがあったらコメントしていただいたら幸いです。