ゾンビとUnityとUE4

ゾンビネタとUnity/UE4でのゲーム制作についてつづるブログです。

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Unity ユニティちゃん2Dで3Dの地形を走る

今なんとなく作ろうとしているゲームは、地形だけ3Dで、その上に配置するキャラやオブジェクトは全て2Dにしようかなと考えています。

unity 2don3d 1

ラグナロクオンライン(RO)が比較的近いです。
ただ、微妙な違いがあって、ROはキャラだけ2Dで、オブジェクトは3Dです。
Gravity - Ragnarok Online
http://www.gravity.co.kr/eng/games/ragnarok.asp


それから、奥行き移動は可能ですが、横スクロールしかしません。
横スクロール2.5Dアクション(RPG?)ということになるんでしょうか。

この2Dのキャラで3Dの地形を移動させる部分のプロトタイプをサクっと作ってみます。
2Dオブジェクトの配置はまだしません。

いつの間にかユニティちゃんデータに2Dバージョンが追加されていたので、有難く使わせていただきます。
ユニティちゃん公式サイトからダウンロードできます。
http://unity-chan.com/



まずは結果から



できました。


作り方

  • ユニティちゃん2Dについている2Dのコンポーネントとスクリプトを削除
  • リジッドボディ(3D)を追加(Freeze Rotation XYZ にチェックを入れる)
  • ボックスコライダー(3D)を全身と足元に2つ追加
  • 自作ユニティちゃんスクリプトを追加

unity 2don3d 2
テレイン(地形)は適当に作ります。
のっぺりした感じにしたかったので、テレインに貼り付けるテクスチャは単一色のものを用意。

unity 2don3d 3
ユニティちゃん2Dに追加した3Dのボックスコライダー
全身用と接地判定用の2つ

自作ユニティちゃんスクリプト
using UnityEngine;

[RequireComponent(typeof(Animator), typeof(Rigidbody), typeof(BoxCollider))]

public class MyUnityChan : MonoBehaviour {

public float speed = 0.1f;
public float jump = 100;
public float gravity = -50;
public Camera my_camera;

private Animator anime;
private Rigidbody body;
private bool is_ground = false;
private float wallx = 0;
private float wallz = 0;
private float face = 1;

private enum State {
Normal,
Damaged,
Invincible,
}
private State state = State.Normal;

private const float RAY_LENGTH = 1.0f;
private const string TERRAIN_NAME = "Terrain";

void Start() {
this.anime = this.GetComponent<Animator>();
this.body = this.GetComponent<Rigidbody>();
Physics.gravity = new Vector3(0, this.gravity, 0);
}

void Update() {
if (this.state != State.Damaged) {
this.Move(Input.GetAxis("Horizontal"), Input.GetAxis("Vertical"), Input.GetButtonDown("Jump"));
}
}

void Move(float x, float z, bool j) {
//向きを設定
this.face = x > 0 ? -1 : (x < 0 ? 1 : face);
this.transform.rotation = Quaternion.Euler(0, (this.face + 1) * 90, this.transform.rotation.z);
this.anime.SetFloat("Horizontal", x != 0 ? x : (z != 0 ? this.face : 0));

//進行方向の壁を調べる
if (Mathf.Abs(x) > 0) { //前方
if (Physics.Raycast(this.transform.position, this.face > 0 ? Vector3.left : Vector3.right, RAY_LENGTH)) {
this.wallx = this.wallx == 0 ? this.transform.position.x : this.wallx; //まだ壁を検出していなければ位置を保存
x = 0; //これ以上は前に進みません
} else {
this.wallx = 0; //壁はなかった
}
}
if (Mathf.Abs(z) > 0) { //手前もしくは奥
if (Physics.Raycast(this.transform.position, z > 0 ? Vector3.forward : Vector3.back, RAY_LENGTH)) {
this.wallz = this.wallz == 0 ? transform.position.z : this.wallz;
z = 0;
} else {
this.wallz = 0;
}
}

//ユニティちゃんを移動
Vector3 p = this.transform.position;
p = this.transform.position = new Vector3(p.x + x * this.speed, p.y, p.z + z * this.speed);
p.z = p.z > 5 ? 5 : (p.z < 0 ? 0 : p.z); //Z=0以上かつ5未満の範囲でZ軸移動できる

//カメラの位置を設定
this.transform.position = p;
this.my_camera.transform.position = new Vector3(p.x, p.y + 7, this.my_camera.transform.position.z);

//アニメーション設定
this.anime.SetFloat("Vertical", this.body.velocity.y);
this.anime.SetBool ("isGround", this.is_ground);

//ジャンプ判定
if (j && this.is_ground) {
this.anime.SetTrigger("Jump");
this.body.AddForce(Vector3.up * this.jump);
this.is_ground = false;
}
}

void OnTriggerEnter(Collider other) {
if (!this.is_ground && other.gameObject.name == TERRAIN_NAME) {
//衝突したのが地形(Terrain)だったら接地したと判断
this.is_ground = true;
this.anime.SetBool("isGround", this.is_ground);
}
}

void OnFinishedInvincibleMode() {
this.state = State.Normal;
}
}
※ユニティちゃん2Dについていたスクリプトをベースにして作り直したものです。


ユニティちゃんが飛んだままのアニメーションになる

接地判定は足元に追加したボックスコライダーで行っていますが、これだけだと不十分です。
地形の形状によっては、ユニティちゃんがジャンプしたアニメーションのまま固まってしまう場合があります。
今回はプロトタイプなので、これ以上は追及しません。


壁判定が難しい

壁があるかどうかは、ユニティちゃんの進行方向にレイを飛ばして判定しています。
これも不十分で、垂直の壁なら問題ないのですが、斜面に対してはうまく判定できません。
その結果、ユニティちゃんの移動スピードが上がると、どんな急斜面でも上れてしまいます。
それを防ぐために移動スピードを下げると、移動がのろすぎて気持ちよくありません。
また、飛ばすレイを長く設定すると、ずっと先にある壁にレイが当たってしまい、何もないところに突っかかってしまいます。
とりあえず、足止めしたい場所には見えない壁を配置することで対応可能です。
これについても追求するのは本プロジェクトでやることにして、今回はこれでやめます。


すっごい滑るよ!

ユニティちゃんに摩擦を設定すれば滑らなくなると思います。
地形によって物理特性マテリアルを変えれば、つるつる滑る床や、驚異的な吸着力のユニティちゃんシューズ!を表現できると思います。


今回作ったプロジェクト一式(7.63M)

https://drive.google.com/file/d/0B5l1YkxnaVHodk9Sal9lcGdkTTA/edit?usp=sharing


ユニティちゃんライセンス

このアセットは、『ユニティちゃんライセンス』で提供されています。
このアセットをご利用される場合は、『キャラクター利用のガイドライン』も併せてご確認ください。


 
スポンサーサイト

- 0 Comments

Add your comment

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。