注目の投稿

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;
}

}

2018年10月19日金曜日

細々した物追加

やばい、やる気ガガガ。

大型ゲームの制作となると、どこから手を付けてい良いか分からなくなって、毎回進みが遅くなる。

どうやら自分はミニゲーム制作しか出来ないみたいです。


そんな訳ですが、進捗。


下手ながら、ストーリーやらキャラクターの見た目の案作って、


岩入れて、


アクション要素のテスト部分を作ってみたりしてます。

とりあえず、

絵がうまくなりたい。

ぶっちゃけ一枚目は載せるべきか悩んだ。だって下手すぎるもんな。

やっぱ絵の練習も必要ですな。

さて、なんやかんや追加したものも少ない。

ステージギミックは動く床とか跳ねる床とかすべる床とか作りようはいくらでもありそう。

あとは、体力の要素とコインの追加ですね。

まだシステム面では作ってませんが要素的な物として。


それでは今日はこの辺で。

最近仕事早く終えたすぎて、頑張りまくったせいで、やる事が無くなってしまいそうな状況に追い込まれ仕事が苦痛。というか時間が経たないので辛い。

はて、どうしますかね。

まあ、残業じゃないので良いですか。

さて明日は金曜日!週末もすぐそこ!

また明日!

2018年10月18日木曜日

NPCの追加とプレイヤーが踏んだら倒せる的なの作る

残業を仕事が無くてもしないといけないかも・・・

なんか契約上でグループでの仕事時間枠を、休んでいる人が居るからほかの人で消費しないといけないらしい。

でも、人数減ってるから期日考えると、結局いる人数分くらいの仕事しかできない。

なんと無茶苦茶な・・・


さてそんな訳で今日の創作。


(クリボー+キノピオ)/2みたいなNPCを作り、


ゲームのMOB敵として配置しました。

ついでに、プレイヤーの足に踏まれると消えるプログラムを作りました。

これは、当たり判定をプレイヤー足元に追加で付け、それが当たったら消えるという物です。

なんか思ったりより、進んでない。

とりあえず追加でアクション的なとこ作っておきます。

そして追加で決まった事。

ストーリーはファンタジー寄り、目的としては魔王に攫われた家族を救う的な。

基本的には、ステージに居るボスを倒したり、目的のアイテムを見つける事で、次のステージが解放されるという感じにします。

勿論ステージ毎にストーリー的なのも有りで。

なんとなく流れが決まってきたので、それにそって作っていこうと思います。


それでは今日はこの辺で。

最近仕事が長く感じて、正直キツさが増してるのに、残業を仕事が無くてもしないといけない状況になりそうです。

ま、頑張っていきますよ。

(辛かったら、辞めそうw)

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

また明日!

2018年10月17日水曜日

そんな訳で3DFPSアクション制作です。

最近時間間隔がおかしい。

仕事はクッソ長く感じるのに、ゲーム作ってる間と週末が短すぎます。


そんな訳で、車ゲームの制作はかなり時間がかかりそうなので、3Dアクションゲームみたいなのを作りたい。

つまるところ、3DマリオのFPS版。

そんな訳で今日の現状。




スタート画面、ステージ選択画面、ステージな訳なんですが、今のところストーリー要素が無いので、ゲームの目的が無い。

マリオには、導入でクッパ姫にピーチ姫がさらわれて、レ〇プ〇イを見たいマリオが向かうという・・・あ、違いました?

まあ、マリオには目的がありストーリーも有るわけですよ。

今の現状では目的が無いので、ストーリーを考えないといけない。

さてどんなストーリーにしたもんか・・・

まあ、考えるとします。

子今回のゲームは中規模ゲームになりそうなので、並行で癒し系のVR制作とミニゲームの制作をするような気がします。

まあ、どうなりますかな。


そんな訳で今日はこの辺で。

最近、PCの調子が結構悪い。

画像が表示されなかったり、ちょっとした地形の編集で長い時間要したりと明らかに昔よりも性能が落ちてるなと。

そろそろ買い替えも考えないといけませんかね・・・

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

また明日!

2018年10月16日火曜日

本日は車ゲー制作です。

上司に朝、「~~~だから協力お願いします。」と言われたが何なのか結局分からなかった。まあ、定時退社しました。

いや、上司同士の会話でその流れで言われても知らんし。結局なんやったんやろ。

怒られたら、プライドもくそも無いジャンピング土下座かましてきます。


そんな訳で、今日は動画の方で、

星避けゲーム「宇宙船に乗って・・・」の紹介動画投稿しました。


まだの方は、ぜひともご覧ください。

なんやかんや昨日のうちに編集は終わってましたが、眠すぎたので今日投稿しました。

まさかの小ネタ発見+詰みかけるほどのダイス神の荒ぶりを発揮してました。


そんな訳で話は変わり今日の進捗。

レースゲームが作りたい。

なんやかんやスマホ向けレースゲームって結構あるんで、正直作らなくても良いかな~とは思うんですが、せっかく今車メーカーで働いているわけですし、ちょっとやってみようかと。

以前からUnityのStandardAsset内に車用のコントローラーと車のモデルが有ったのでちょっと触ってみております。


で、そのコントローラーがなんとスマホを傾けて操作出来る物なのです。

前に傾けコントローラー使った時はダメでしたが、こっちはちゃんと動くみたい。

しかし、車の構造を見てると結構難しそうな仕組みしてる。

これは自作の車データ作るの結構大変そう。

ただ車のベースデータが有るので、車種ごとに数値弄れば、色んな特性も出せそう。

ベースで入っているの、めっちゃ曲がるけど割とスリップもすると言う、初代マリオカートみたいな状態です。

ただ、ベースにスキール音(タイヤがキーキーいうやつ)が入ってるので、エンジン音を追加出来たら面白そうです。

ただ、これまた勉強する事が多そうなので、今後の課題ですね。


さて今日はこの辺で。

明日の仕事嫌だな・・・とか思いつつも明日はやってくるので諦めます。

もう既に派遣先では変人って認識なので、特に気にするほどでもないかとも。

また明日。

2018年10月14日日曜日

星避けミニゲーム「宇宙船に乗って・・・」のスクリプト紹介

少し遅れ気味ですがスクリプト紹介を。

(週末って仕事の疲れで抜け殻状態なんですよね・・・)

さて、今回紹介するスクリプトは、

星避けミニゲーム
「宇宙船に乗って・・・」

の使用スクリプトです。

役に立つ人が居るのかと聞かれたら、自分には何とも言えませんが誰かの役に立つと信じて。

内容は

1.スタンダードアセットのコントローラーを使ったプレーヤー(宇宙船)のスクリプト
2.避ける星のスクリプト
3.星をランダムに生み出すスクリプト
4.ステージ中のタイマーとそのセーブのスクリプト
5.リザルト画面でのタイマーの時間表示のスクリプト

以上、5つとなっています。


では、まず一つ目。宇宙船のスクリプト。

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

public class Player : MonoBehaviour {

private AudioSource[] sources;
private float countTime;
private int X;

void Start(){
sources = gameObject.GetComponents<AudioSource>();
X = 0;
}

private void Update(){
float h = CrossPlatformInputManager.GetAxis("Horizontal");
float v = CrossPlatformInputManager.GetAxis("Vertical");

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

if (X == 1) {
countTime += Time.deltaTime;
if(countTime >= 0.3){
SceneManager.LoadScene ("SceneEND");
}
}
}

public void OnCollisionEnter2D(Collision2D collision){
if (collision.gameObject.tag == "hoshi") {
FindObjectOfType<Timer> ().Save ();
sources[0].Play();
X = 1;
}
}
}

特に今回新しく追加したものがこれ。

using UnityStandardAssets.CrossPlatformInput;

float h = CrossPlatformInputManager.GetAxis("Horizontal");
float v = CrossPlatformInputManager.GetAxis("Vertical");

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

これは、スタンダードアセットのコントローラーのインプットを取得し、このプログラムを付けたアイテムの位置を変更するという物です。

恐らくusingの部分で他スクリプトの参照をしているのだと思われます。

いや、自分も元のスタンダードスクリプトの中身を眺めて、「これかな~」という感じにやって動いてるだけなので詳しい事は分からないという。

でスタンダードアセットのインプットに有るデータ「Horizontal」「Vertical」、横方向と縦方向の入力を取ってきているわけだ。

簡単に言えば上の3行で、スタンダードアセットのクロスプラットフォームインプットが使える訳だ。

ぶっちゃけアプリ制作にはかなり便利な物かと。


続いて、流れる星のスクリプト。

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

public class hoshi : MonoBehaviour {

private float time;

void Update () {
transform.position += new Vector3 (0.0f, -1.5f*Time.deltaTime, 0.0f);
time += Time.deltaTime;
}

public void OnCollisionEnter2D(Collision2D collision){
if (collision.gameObject.tag == "Finish") {
Destroy(gameObject);
}
}
}

凄い簡単に言うとUpdateの度に、時間×-1.5にして、画面上部から落ちてくるようにし、フィニッシュオブジェクトにぶつかると消えるという物だ。

ステージ外に延々と残すのも動作影響が出るので、これが一番良いと思う。

動作には、星自身にRigid Body2Dを付けて、Gravity(重力)を0にしてる。

重力の加速する落ち方で良いなら、当たり判定のみあれば良いです。


続いて、ランダムに星を出す方法。

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

public class RandomBorn : MonoBehaviour {

public GameObject hoshi1;
public GameObject hoshi2;
public GameObject hoshi3;
public float timeOut;
private float timeElapsed;
private int X;


void Start(){
X = 0;
}

void Update() {
timeElapsed += Time.deltaTime;

if (timeElapsed >= timeOut) {
X = X+1;

if (X == 1) {
// 動作させたいこと

int random1 = Random.Range (0, 2);
int random2 = Random.Range (0, 2);
int random3 = Random.Range (0, 2);
int random4 = Random.Range (0, 2);
int random5 = Random.Range (0, 2);

timeElapsed = 0.0f;
X = 0;

if (random1 == 0) {
int random11 = Random.Range (0, 3);

if (random11 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (-2, 4, 0);
}
if (random11 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (-2, 4, 0);
}
if (random11 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (-2, 4, 0);
}
}

if (random2 == 0) {

int random21 = Random.Range (0, 3);

if (random21 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (-1, 4, 0);
}
if (random21 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (-1, 4, 0);
}
if (random21 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (-1, 4, 0);
}
}

if (random3 == 0) {

int random31 = Random.Range (0, 3);

if (random31 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (0, 4, 0);
}
if (random31 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (0, 4, 0);
}
if (random31 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (0, 4, 0);
}
}

if (random4 == 0) {

int random41 = Random.Range (0, 3);

if (random41 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (1, 4, 0);
}
if (random41 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (1, 4, 0);
}
if (random41 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (1, 4, 0);
}
}

if (random5 == 0) {

int random51 = Random.Range (0, 3);

if (random51 == 0) {
//配置
Instantiate (hoshi1);
hoshi1.transform.position = new Vector3 (2, 4, 0);
}
if (random51 == 1) {
//配置
Instantiate (hoshi2);
hoshi2.transform.position = new Vector3 (2, 4, 0);
}
if (random51 == 2) {
//配置
Instantiate (hoshi3);
hoshi3.transform.position = new Vector3 (2, 4, 0);
}
}
}
}
}
}

めっちゃ長いですが、恐らくこれも省略できそうな気がする。

スクリプトで、指定時間に一度のみ実行させる判定をifで書き、その後5か所の出現有り無しをランダム選択後、各場所に入るものをランダムで選んでいるという物です。

注意すべき点は、指定時間に一度のさせる処理を忘れない事。

void Update() {
timeElapsed += Time.deltaTime;

if (timeElapsed >= timeOut) {
X = X+1;

if (X == 1) {
// 動作させたいこと、判定リセット
          X = 0;

これを忘れUpdateに直接書けば、延々と星が増殖されます。

で、ここに来て気が付きました。

今回の場合指定時間を超えていればいいので、

void Update() {
timeElapsed += Time.deltaTime;

if (timeElapsed >= 1) {
X = 0;

これで大丈夫ですね。

このスクリプト自体、音楽ゲーム用に、フレーム判定まで考えシビアにしようとした時に作ったものなので、その違いに気が付けてなかったです。


さて、続いてタイマーとセーブ。

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

public class Timer : MonoBehaviour {

public static float countTime;
public static float clearHighTime;

public UnityEngine.UI.Text TimeText;
public UnityEngine.UI.Text HighTimeText;

public static string highScoreKey = "highScore";

void Start () {
countTime = 0;

clearHighTime = PlayerPrefs.GetFloat (highScoreKey, 0);
}

void Update () {

countTime += Time.deltaTime;

if (clearHighTime < countTime) {
clearHighTime = countTime;
}

TimeText.text = countTime.ToString ("F2"); 
HighTimeText.text = clearHighTime.ToString ("F2"); 

}

public void Save ()
{
// ハイスコアを保存する
PlayerPrefs.SetFloat (highScoreKey, clearHighTime);
PlayerPrefs.Save ();
}

public static float countTimeget()
{
return countTime;
}
public static float countHighTimeget()
{
return clearHighTime;
}
}

ま、こんな感じ。

タイマーは0.00単位まで表示で、ハイスコアを越えたらスコアをハイウコアにいれる。

そんで後は、ゲーム終了時にセーブと。

セーブに関しては、Unityの基本システムらしいので、特に別で設定はいらないかと。


最後にハイスコアの表示。

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

public class TimeHyouji : MonoBehaviour {
public UnityEngine.UI.Text Time;

public UnityEngine.UI.Text HighTime;

private float cleartime;

private float clearHighTime;

// Use this for initialization
void Start () {
float cleartime = Timer.countTimeget();
Time.text = cleartime.ToString("F2");

float clearHighTime = Timer.countHighTimeget ();
HighTime.text =clearHighTime.ToString("F2");
}
}


簡単すぎんかこれ。

前のシーン、つまるところタイマーを使ったステージのsceneで両方とも数字が作られてる&呼び出されてるので、特にここでは表示のみ。

Time.text = cleartime.ToString("F2");

このF2の部分が0.00表示の意味、F1なら0.0、F0なら0となる訳です。


さて、今回は星避けゲーム「宇宙船に乗って・・・」のスクリプトを紹介してきましたが、いかがでしたでしょうか。

正直、「思い通りに動けばいいや」でげーむを作っているので、スクリプトのもっと効率の良い書き方等も有ると思いますので、その辺は自分で探してください。

またスクリプトで分からない事が有れば、Twitterの方にリプでもとばいて貰えればと思います。

そして今後もゲーム制作のスクリプトはこうしてブログにしていくので、またどうぞよろしくお願いします!

それでは、今日はこの辺で。

また明日!

2018年10月12日金曜日

「宇宙船に乗って・・・」リリース完了しました!

星避けミニゲーム「宇宙船に乗って・・・」Android版リリースしました!

実際にダウンロード出来るようになるのは、数時間後かもしれませんが。


そんな訳で改めて紹介を。

星避けミニゲーム「宇宙船に乗って・・・」です。

宇宙船を操って、流れてくる星を避け続けるゲームです。




昨日のうちに、バグ修正を行い、音楽の追加を行い、という感じで形にはなっていたので今日はリリース作業でした。

そんな訳で、スクリプトやら紹介動画は今週末にでも、まとめて投稿しますかね。

さて、短いですが今日はこの辺で。

詳しい事は週末にまとめたいと思います。

それでは、Androidをお持ちの方は、ぜひプレイしてみてください!

最後までお付き合い頂きありがとうございました。

また明日!

2018年10月11日木曜日

リリースは明日になりそうです。

案外音の設定と、細かな調整に時間がかかりました。

ま、それでも明日残業が無ければリリース出来るかと。

とりあえず今日の時点でリリースページ用の画像作成、最終的なバグの修正(ゲームが成立しなくなる要因のみ)の修正が終わっています。

この後、今日中にリリースページを完成させて明日リリースデータの書き出しと公開ですかね。

今回のは、「リリースする喜び、感じたい!」という物なので、ゲーム性としては何とも物足りないですが、良ければプレイお願いします。

また以前のゲームでやったようなリリースイベントもやりたいと思いますので、ご参加いただければと思います。

それでは、とりあえずリリースページ用の画像紹介をしておきましょう。



ま、こんな感じで。

前の二つのゲームは英語で作成しましたが、今回は日本語のアプリとなっています。

正直、英語にする意味もあんまりないかなって。リリース数変わらんし。
(いや、インストール数知らんけども。)

明日をお楽しみに!(残業無い事を祈ろう・・・)


そんな訳で今日はこの辺で。

なんやかんやリリースするする詐欺みたいなゲームを大量に量産しすぎて、自分でも今どれが作りかけなのか分からなくなっておりますが、今後も頑張っていきます。

この後は、どのゲームの制作を再開にしますかね・・・

前作ってた縦画面のアクションゲームを完成させますかね。

あの狂気の奴です。

自分で「狂気」って言っちゃったぜおい。

やはり原点回帰・進化を見せねばなるまいて。

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

また明日!

2018年10月10日水曜日

もうすぐリリース・・・!

久し振りにゲームのリリース出来そうです。

簡単な星避けゲームですが、やっぱりリリース出来るのは嬉しいもんです。

それでは今日は現状報告。


ロード画面的な感じで、操作の説明画面を追加しました。

指定時間が経つと、ゲーム画面に移ります。


左上の数字の上は、ハイスコア。

下が今のスコアです。

ハイスコアを超えると、ハイスコアも増ええていきます。


こんな感じで一定間隔ランダムで星が流れてくるので、それを避ける物になっています。

ただ、動かしていると稀に回避不能な配置が出たり、処理ミスで複数出たりしますが、まあその辺はご愛敬という事で。

ダイスの神様にお祈りくださいな。

星にぶつかると、


ゲームオーバー画面に移行します。

今のスコアとハイスコアが表示され、スタート画面に戻れるボタンが表示されます。

ハイスコアはアプリを消しても、ちゃんと保存されるようになっています。

今までに考えたシステムや作ったシステムの複合では有りますがそれなりに苦労しましたね。


さて、後は、ゲームにBGMやSEを設定して、リリース用のアイコン作ったり、スクリーンショット準備したりですね。

リリースに合わせて、紹介動画の投稿、プログラムの掲載なども行いますので、またよろしくお願いします。


さて、今日はこの辺で。

おそらく明日か明後日にはリリースできるんじゃないかなと。

というかリリースしてみせる。

ま、お待ちくださいな。

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

また明日!

2018年10月9日火曜日

Time.deltaTimeが使えなかった理由が分かった。

Timeっていう変数をstring型(文字列)で作ってたので、

動かなかっただけでした。


そう時間を取り扱う、というか時間をフレームで増やす処理は、

Time.deltaTime;

な訳ですが、自分の場合、この前に、

public UnityEngine.UI.Text Time;

という物を作っていたせいで、

Time.deltaTime;のTimeが上のテキストの変数Timeを呼び出されていたので、エラーが出ていたわけです。

すっごい初歩的な事。名前が被っているという。

まさか過ぎて悲しくなりました。

そりゃあ、名前が同じじゃプログラムは判別できませんわな。

そんな訳で、

public UnityEngine.UI.Text Time;
public UnityEngine.UI.Text TimeText;

と変更しました。

これにてエラー解決。

まだまだ基本すら危ういという事が理解出来ました。


以上、臨時更新の報告でした。

また明日!

スクリプトに苦戦する。

Time.deltaTime使えないの、なんで( ^ω^)

なぜや、普通使えないとかあり得んだろ。

出るエラーが以下。

Type `UnityEngine.UI.Text' does not contain a definition for `deltaTime' and no extension method `deltaTime' of type `UnityEngine.UI.Text' could be found. Are you missing an assembly reference?

日本語訳
タイプ `UnityEngine.UI.Text 'は` deltaTime'の定義を含んでおらず、タイプ `UnityEngine.UI.Text 'の拡張メソッド` deltaTime'も見つかりませんでした。

いや、ちょっと待てや。

その前の行に、

using UnityEngine;

入れてるぞ?

なんでちゃんと動かんのや。

うーん謎。

こんな事初めてなので、如何したらいいものか。

ま、それ以上にUnityからスクリプトのアクセスが切れているんですよね。

まじ、急にこんなに色々問題が出るのやら。

リリースが伸びるの辛い。

どうにかしていきますよ。


さて今日はこの辺で。

リリースはどうなるやら。

ゆうても金曜までにはリリースしたい。

頑張ります。

また明日!

2018年10月4日木曜日

ミニゲーム制作、開始。

なぜかアプリとして書き出せんぞ・・・

はてさて、ミニゲーム制作を始めた訳ですが。



宇宙船というかロケットで星を避けていくゲームです。

で、ロケット操作用のコントローラーを入れて実機テスト導入しようとしたのですが、

スマホへの書き込みが成功しない・・・( ^ω^)

過去作の他のゲームでは、特に問題ので余計に不思議。

でもエラーだと、「AndroidSDKを確認してください」的なのだけ。

どうせいと。

プレイヤーセッティングなのか、なんなのか。

この週末にはリリースをしたいのに、なんやかんや手間取りますね。

ま、詳しい事は明日。


さて、仕事がキッツイ。

何故か仕事を教えてくれてた上司が二ヶ月かかったものを、

「頑張って3週間でやってね」と。

で、「頑張ってやらんときついですよね、これ・・・」って自分が言うと、

「間に合いそうになかったら、休日出勤してね?」と。

いや、おかしくね?

既に何年も働いてる人が二ヶ月かかるのに、そのソフトウェア使い始めて3か月の新卒派遣社員に何を求めてるんだ?

もうストレスMAXですわ、これ。

これで死ぬ気でやって期日に普通に間に合ったら、さらに仕事内容キツくなるんかな・・・

もうお仕事やめたい、いやほんと。

この国の良くない事を、全身で体験してる気しかしない。

まじで、バックレたい・・・


さて今日はこの辺で。

明日は金曜日。頑張れば週末。ま、台風ですが。

頑張らないと、俺の休日が減ってくだけで。

また明日!

2018年10月3日水曜日

怪獣バスターズ的な(以下ry

動画のコメントで、怪獣バスターズ的なの作ってみてください!って有ったんで、やってみる。

丁度気分転換に良さげですし、仕組みは少し考えてたんで。


と言いつつ、怪獣バスターズしたこと無いんで、自分がイメージするのはモンハンのFPS銃ゲームです。

モンハンではなんやかんや、銃が銃の扱いしてないとか言われてた記憶が有りますが、ならば救済できそうなゲームを作りたい。

と言いつつ、ゴッドイーターのスマホ版で、

「スマホで瞬間的なアクション性を高めるのは無理がある。」

というのは、よく聞きました。

分かりやすく言うと、ボタンを押している感覚が無いので、アクションでは操作ミスが出るみたい。

で考えていくと、大型のモンスター相手にして人間対ゴジラみたいな感じが良いかと思う。


うん、圧倒的にモンハンのフルフルなんだよなぁ
( ^ω^)・・・

ただ、モンスターを倒すだけだと飽きられるので、ミッション内容に幅を持たせる必要がありそう。

都市防衛戦、隠密線、狙撃戦、殲滅戦、まあストーリーやシチュエーション、ステージで色々変更できそう。

困るとすれば設定する事が多い事か。

武器の種類、モンスターの種類、ステージ。

なんやかんやで大型のゲームになりそう(;・∀・)

いったい自分はどれだけ大型ゲームを作り始めれば気が済むのかといったところですが。

そろそろゲームリリースの喜びも味わいたい。

やっぱり明日はミニゲーム作ります。

はあ、本当に仕事せずにゲームと動画だけ作って生活したいです。

今日とか残業で8時まで会社にいたので創作不足感凄い。


それでは今日はこの辺で。

明日は週中、水曜日。

頑張っていきましょ。

また明日。

2018年10月2日火曜日

Mobile Tilt Control Rigの使い方が分からない

マジでどうやって使うんだあれ・・・

UnityのStandardAseetに入っている「mobile tilt control rig」という恐らくスマホのジャイロセンサー的なサムシングを読み取っては反映するコントローラー的な物が有るんですが、使い方が分からない。

で、分からないからネットで調べるも外国語のサイトばかりが出てくる。

英語もプログラムも真面に出来ない自分にとっては、結構辛い。


はてさて近況報告。

なんかこの前の動画制作とブログ書きでやり切った感出てグダグダしてました。

いかん、仕事以外が殆ど引きニート状態なので、どんどんダメになっていってる。

最近週末が雨ばかりでなんかやる気出ないです。

と言っても気が付けば、頑張るぞー!とか8月末に言ってから1ヶ月経ってる。

本当に時間の流れがめちゃくちゃ早い。

毎日少しづつでも創作頑張らないとな・・・


さて、今日はmobile tilt control rigの使いかたを調べましたが、結果としては、

「使い方が分からない」という事が分かりました。

答え、うっすいなぁ・・・

明日以降何しよ。

とりあえずこの前作り始めたゲームでも作るか、それともミニゲーム的なの作るか。

ま、企画のファイル見てみますか。


さて話は変わり、

仕事以外ニートだと、本当にお金が貯まる。

多分就職して6か月分の給料で50万近い位。

独立用の資金貯まるのは良いのですが、それに創作技術が追い付いていない。

やはり仕事が車の部品設計とか、全然関係ないもんですね。

CAD使えたとこでゲーム制作の簡単なモデリングが限界ですし。

やっぱりプログラム系の会社の方が良かったのか?

就活もっと頑張っておけばよかったなと今更後悔しております。


さて今日はこの辺で。

なんやかんや一日の作業時間は少ないですが、頑張って技術高めないとですね。

最近やっぱり絵の練習もしたいななんてのも思っています。

ゲームに使えたら便利ですからね。

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

また明日。

2018年9月24日月曜日

Unityで町中⇔建物を実現する。


UnityRPGの建物出入り的なのを作りたい。


簡単に言えば、町のシーンから家に入って、家を出ると家の出口に居るみたいな。

完全に個人での開発になるので、参考になるかは不明ですが。


あ、動画「お久ゲーム制作3Dアクションですよ!」を見ながらだと、どういう感じか分かりやすいかと。

(動画内では2階に上がってますが、あれはTrasformPositionで遠くに置いてる二階に飛ばしてるだけです。この記事を読み終えれば恐らく出来ると思います。)


まず、今回作る仕組みについて。

Unityは比較的変数の入れ替え・受け渡しが簡単なので、変数でどのsceneから移ってきたかを判別させます。


まずスタート画面。(以下はスクリプト、そのままコピーできるかと思います。)

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

public class startOP : MonoBehaviour {

    public static int Cscene1 = 0;

    public void OnClick(){
        SceneManager.LoadScene ("Scene1");
    }
}

初歩的な事では有りますが、public classの後は、プログラムのファイル名「~~~~.CS」の~~~~を入れてください。

まずこのシーンで、町のステージになるScene1用のどこのシーンから来たか判別するための変数を作ります。

Public staticとする事で、どこからでもこの変数を書き換えやアクセスが出来るようになります。

今回は「Cscene1」としましたが、ご自分の管理しやすいように名前は変えてください。

とりあえずで「0」を入れておきます。

で最初は普通にscene1のキャラクター初期位置になります。


続いてscene1(以下、スクリプト)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PositionScene1 : MonoBehaviour {

    public GameObject Player;

    // Use this for initialization
    void Start () {
        int x = startOP.Cscene1;
        Debug.Log(x);
        if (x == 1) {
            Player.transform.position = new Vector3 (010, -30);
            Player.transform.rotation = Quaternion.Euler (0, -1600);
        }
    }
}

こちらもclass名はお好きなように。

このプログラムはscene1Create Emptyで作った箱に設定しておきます。

まずpublic GameObjectでプレイヤーキャラを指定する枠を作ります。

そこにscene1Inspectorでプレイヤーになるものを設定します。
(タグから自動で設定も出来なくはないが、プレイヤーは基本一つなので今回はこれで。)

まず、sceneが始まった時に、void Startで先程作った変数を取得します。
Debug.Logはプレビューで動作の確認用。

最初にこのscene1を読み込んだ時点では変数は「0」なので、特に何もなくプレイヤーは配置したとこから。


町の中から建物に入ります。

建物に入るスクリプトは以下のように。

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

public class Scene1inTATEMONO : MonoBehaviour {

    void OnTriggerEnter(Collider hit){
        if (hit.CompareTag ("Player")) {
            SceneManager.LoadScene ("SceneTATEMONO1");
        }
    }
}

建物入り口に後は当たり判定を置き、そこにTagPlayerが付いたものがぶつかると、scene移動で建物内に入ります。
入り口用の当たり判定は、「Is Trigger」にチェックを入れておいてください。


さてここからが本題。建物から出たときに、先程のscene1でスタート地点ではなく建物入り口前に出るようにします。

建物出口のプログラムは以下。

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

public class Scene1outTATEMONO : MonoBehaviour {

    void OnTriggerEnter(Collider hit){
        if (hit.CompareTag ("Player")) {
            startOP.Cscene1 = 1;
            SceneManager.LoadScene ("Scene1"); 
        }
    }
}

ここで、最初に作った変数に1を入れます。

それ以外は入る時のプログラム・当たり判定と一緒です。


改めて、scene1のプログラムを見てみましょう。

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

public class PositionScene1 : MonoBehaviour {

    public GameObject Player;

    // Use this for initialization
    void Start () {
        int x = startOP.Cscene1;
        Debug.Log(x);
        if (x == 1) {
            Player.transform.position = new Vector3 (010, -30);
            Player.transform.rotation = Quaternion.Euler (0, -1600);
        }
    }
}

先程は最初に作成した変数に「0」が入っていたのでif文以下の処理は行われていませんでしたが、今回は「1」が入っています。


1が入っている場合、

  Player.transform.position = new Vector3 (010, -30);
  Player.transform.rotation = Quaternion.Euler (0, -1600);

Playerの枠に設定されたもの、今回はプレイヤーキャラが、この場所に自動で置かれます。

まず上の文が、絶対座標での位置。カッコ内は、x、y、zの位置です。
今回は建物入り口前。

ついでに、建物が回転しているので、その向きに合わせてキャラクターを回転させます。
これもカッコ内はx、y、zです。

両カッコ内は、物の位置に合わせて置いてください。
(多分入り口の位置を取得して、そこから+幾つとかも出来るのですが、今回は割愛)


これで、建物に入ったり出たりの完成です!

今回のシステム、他にも利用法は幾つかあります。

イベント的なシーンで変数を入れ替えて、物の配置を一気に変更したり、建物の出口を別の世界にしたり。

使い方は、色々と今後も紹介できると思います。


さて今回の方法、完全にkou0128の独自方法なので、恐らくもっと簡単な方法も有るかと思います。

少しでもゲーム開発の役に立てばと思います。

案外個人開発で困るのが、情報集めだったりするので、今後はこうして作ったプログラムの紹介をしていきます。


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

Kou0128がお送りいたしました!