注目の投稿

2023年、明けましておめでとうございます。4か月ぶりです。

 新年だけ思い出したかの様に更新するkou0128です。 という訳で、どうもお久しぶりでございます。 前回の更新から丸4ヶ月も経っている事に驚きつつ、2023年初の更新をさせて頂いております。 年末年始実家に帰省しする事が無いので、ブログ更新が出来るという皮肉。 さてさて前回の更...

2018年12月13日木曜日

2D横スクロールの横移動とジャンプをする

自作イラストを使って配管工おじさんをする。


物凄く言葉が足りませんが、自作イラストを使って2D横スクロールの基本動作となる
横移動とジャンプ

これを作っていきたいと思います。


今回使うもの。


スライムの自作イラスト。
(ご自由にお使いください。ただし、著作権の放棄をしているわけでは有りません。例を上げれば、LINEスタンプにしたりとか、犯罪に使うとかをしないでくださいって感じです。)


目次

1.動作紹介
2.GameObjectの構成紹介
3.スクリプト紹介(そのままコピー出来る物有り)

以上の様に進めていきたいと思います。


1.動作紹介


動作紹介という名の動画の宣伝だったりしますが、実際こんな感じで動くってのが見て貰えます。

若干、横移動時にカクツキというか地面に引っかかっている様に見えますが、仕様です。

いずれ時間があったら直すかも。(多分直さない)

ぶっちゃけ2Dについては、まだ3つくらいしか作りかけが無いのでほぼ初心者です。

あくまで、今回はスクリプトの紹介程度に思って頂ければ幸いです。


2.GameObjectの構成紹介

まずは、プレイヤー構成の紹介から。

一応取込も紹介しておきますね。

まず、上にあるスライムをAseets内に入れます。
取り込んだ画像を選択し、Texuture TypeをSprite(2D and UI)に変更します。


ステージ内に、Createから2D→Spriteを配置します。
その中のSprite RendererのSpriteで先程取り込んだスライムの画像を選択します。

そして、スライムの大きさに合わせてPhysics2DからCircleCollider2Dを取りつけます。
これがプレイヤーの当たり判定になります。

続いてプレイヤーに重力を付けます。
Physics2DからRigidbody2Dを取り付けます。これに関しては触らなくてもいいかと。
場合によっては弄る事も有りますが、今回はスルーします。

基本的にステージ上で動かすものには、Collider(当たり判定)とRigidbody(重力とか)の二つは大体付けます。

そして最後に、今回ジャンプをするためのスクリプトをプレイヤー付けます。
内容は後述になります。

今回はもう一つ。地面の設定をします。


まずは一番上のTagに「jimen」を作成して付けます。

ぶっちゃけ自分で分かるもので有れば、何でもいいんですけどね。
後でジャンプのスクリプトに使うので、英字で作っていればなんでも良いですよ。

こちらは固定された物になるので、Rigidbody2Dは必要ありません。

今回のスクリプトでは、[OnCollisionEnter]というのを使うのですが、これはTagとColliderが有れば使えます。

※3Dで同じような動作をする場合は少し変わりますが、それはまたいずれ動画とブログで書きます。


3.スクリプトの紹介(一番下にスクリプトを載せています)


まずはプレイヤー操作スクリプトです。

プレイヤースクリプトは、シーン内に単体のGameObjectとして配置しておきます。

void Update内で左右の入力を読み取り、それに合わせてプレイヤーの左右の移動とプレイヤーの向きを変えています。

new Vector3 (0.05f,0.0f,0.0f);の0.05がx方向の移動量になるので、これを変えれば動くスピードも変わります。

そして下のvoid OnClickはジャンプボタンに設定する内容になってます。

変数が0のときジャンプができ、ジャンプの力がかかった後、1に変更にします。

0に戻す処理はジャンプ判定スクリプトにて行います。


そしてこのジャンプ判定スクリプトをプレイヤーに付け、プレイヤーが地面のTag[jimen]に触れた時、先程のスクリプトの変数を0に戻します。

今回のスクリプトは、一度ジャンプしたらという物ですが、二段ジャンプも出来ます。


こんな感じでifの条件をx<=1とすると、xが0と1の場合にジャンプの処理が行われるので、二段ジャンプになります。

といってもそのまま使うと、少し変な動きになりましたが。
出来なくは無いです。

ジャンプ量を変えるには、new Vector(0.0f,7.5f);の7.5の部分を変えたら変わります。


さて、ここまで2D横スクロール用の移動とジャンプを見てきましたが、いかがでしたか?

分からない事が有ればコメントやTwitterの方に連絡して貰えれば、分かる範囲でお答えしたいと思います。

それでは、最後までお読み頂きありがとうございました。

また次のブログもよろしくお願い致します!


スクリプト紹介

Player.cs  (OnClickは1回ジャンプ、OnClick2は二段ジャンプ用です。)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.CrossPlatformInput;

public class Player : MonoBehaviour {

public static int x;

public GameObject Player1;

void Start () {

}

// Update is called once per frame
public void Update () {
Debug.Log (x);
float h = CrossPlatformInputManager.GetAxis ("Horizontal");

Player1.transform.position += new Vector3 (0.05f * h, 0.0f, 0.0f);

if (h >= 0.1) {
Player1.transform.rotation = Quaternion.Euler (0.0f, 0.0f, 0.0f);
}
if (h <= -0.1) {
Player1.transform.rotation = Quaternion.Euler (0.0f, 180.0f, 0.0f);
}
}

public void OnClick(){
if (x == 0) {
Rigidbody2D rb = Player1.GetComponent<Rigidbody2D> ();
Vector2 force = new Vector2 (0.0f, 7.5f);
rb.AddForce (force, ForceMode2D.Impulse);
x = 1;
}
}

public void OnClick2(){
if (x <= 1) {
Rigidbody2D rb = Player1.GetComponent<Rigidbody2D> ();
Vector2 force = new Vector2 (0.0f, 7.5f);
rb.AddForce (force, ForceMode2D.Impulse);
x += 1;
}
}
}


Jumphantei.cs

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

public class jumphantei : MonoBehaviour {

public void OnCollisionEnter2D (Collision2D hit){
if (hit.gameObject.tag == "jimen") {
Player.x = 0;
}
}
}

2018年12月10日月曜日

UnityでのVR歩行スクリプト紹介

念願の夢、自作VRでの歩行



と言いつつ今回紹介するのは歩行と言っていいのか。

動画有るんで、良ければ再生とチャンネル登録お願いします。



まずは目次。

1.UnityでVRを作り、自由に歩きたい
2.GameObjectの構成紹介
3.スクリプトの紹介

このようになります。

1.UnityでVRを作り歩きたい!

まず、UnityでVRを作る中で、

「自分の作った世界を歩きたい!」

となりました。

まあ、せっかくですからね。

そんな訳で悩みに悩んで数か月。(実働では30時間位だろうけど)

なんとか簡単な物が完成しました。

ぶっちゃけネットで調べても中々ちゃんと動くスクリプトって見つからないので、2018/12/10日時点で、自分が作ったものを載せておきます。
(既に誰か作ってたら、すまんな。)


2.GameObjectの構成




ざっくりとこんな感じです。

Playerの下に、動くカメラとVR用のシステム、それに8方向の矢印それぞれという感じです。

矢印の中身は、スクリプトが各方向用の数字になっているので、そこだけ違います。

後に書くスクリプトと合わせてご覧くださいな。

この構成上、視線を動かした時に動くものがMainCameraだけなので、Playerや各矢印は回転しません。

ただ、プレイヤーのRigidBodyで回転を止めるチェックを入れていないと、物にぶつかった拍子に回転し続けます。(2枚目参照)


3.スクリプト紹介 (スクリプトのコピー用は一番下です。)


まずは、移動量の一括管理スクリプトです。

わざわざ8方向全て書き換えるのが面倒なので、front = 0.05fの0.05を書き換えるだけにします。

注意点としては、staticを使ってどこからでも読み書きできるので、他のスクリプトで数字を書き換えない事。

frontが上下左右。nanameが45度方向になります。

naname = front*0.7fとしてるのは、上下左右と移動量を合わせるためです。基本的に書き換える事は無いと思います。



矢印のスクリプトです。

視線の認識をした二つの「public void enterPointer」と「public void exitPointer」で認識。

startで先程の変数管理スクリプトから、上下左右用のfrontを設定するか、斜め用のnanameを設定します。

後は、if(time >= 1)内で、1秒以上視線が当たっている時、Update毎にプレイヤーのポジションを追加すると言う状態です。

実際たどり着いてみれば、何の事も無い簡単なスクリプトで行けてしまいましたね。


ずっと自分は、一つの矢印を使い、trasform.forwardで組もうとしていたので、こんな単純な事を見失っていました。

それとforwardは書いたスクリプトを付けたオブジェクトのZ方向に進みます。
意外と迷う事だと思いますので、今回は使いませんが書いておきます。


さてここまで、VR上で歩行に近いシステムの紹介をしました。

どうぞVR制作にお使いくださいな。

それでは、最後までお読み頂きありがとうございました!

今後kou0128もVR制作に力を入れていきますので、応援よろしくお願い致します。

また見てね!


スクリプト紹介

HensuuKanri.cs

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

public class HensuuKanri : MonoBehaviour {

public static float front = 0.05f;
public static float naname = front*0.7f;

}


ScriptFront.cs

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

public class ScriptFront : MonoBehaviour {

private bool counter; //カウンタ
private float time; //経過時間
public GameObject Player1;
private float x;

// Use this for initialization
void Start () {
counter = false;
time = 0;
x = HensuuKanri.front;
}
// Update is called once per frame
void Update () {
if (counter) {
time += Time.deltaTime;

if (time >= 1) {
Player1.transform.position += new Vector3 (0.0f,0.0f,x);
}
}
}

public void enterPointer(){
Debug.Log ("Enter Pointer");
counter = true;
}

public void exitPointer(){
Debug.Log ("Exit Pointer");
counter = false;
time = 0;
}

}


ScriptFrontRight.cs

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

public class ScriptFrontRight : MonoBehaviour {

private bool counter; //カウンタ
private float time; //経過時間
public GameObject Player1;
private float x;

// Use this for initialization
void Start () {
counter = false;
time = 0;
x = HensuuKanri.naname;
}
// Update is called once per frame
void Update () {
if (counter) {
time += Time.deltaTime;

if (time >= 1) {
Player1.transform.position += new Vector3 (x,0.0f,x);
}
}
}

public void enterPointer(){
Debug.Log ("Enter Pointer");
counter = true;
}

public void exitPointer(){
Debug.Log ("Exit Pointer");
counter = false;
time = 0;
}

}