Unity勇者の冒険の書

Unityで学んだことや便利なものなど作ったら紹介します

【Unity勇者の宿屋】GlobalGameJam 2016に参加してきた

本題の通りです。名古屋工学院にお邪魔してきました!

学生最後ってことと毎年参加してるので、参加してきました!

しっかり完成させることができたんで良かったです!

www.youtube.com

White Death | Global Game Jam®


こんな感じのが出来ました

最初の企画で、フックショットアクションって聞いて、
ロープっぽい感じをどうやって出すかにすごく時間がかかりました…

調べてみたら、いい感じのAssetが!

でも…高い! orz

Asset Store

結局自作しました!

でもゴリ押し気味にやりました(後悔はしてない)


おかげでJoint2Dのことを結構勉強できてよかったです

今度Joint2D使ったゲーム作りたいですね


GameJamは、学生ならどんどん参加するといいと思います!

友達も出来るし、新しい体験ができるし、
チームで作るっていう楽しさも味わえます!(徹夜で作る経験もできます)

是非、DONDON参加しましょう!

【Unity勇者の奮闘記】uGUIの色々をローカライズさせる

お久しぶりです('ω')

皆さんUGUIのローカライズ、困ってませんか??

テキストはこちらの記事に以前紹介しました!

lightgive.hatenadiary.jp


Imageは変えられるけど、ボタンの画像が押した瞬間変わっちゃうとか。

テキストとかイメージとかあって面倒ですよね!

そんな時、これを使うと便利ですよ!

github.com

使い方は、英語の時と日本語の時の二種類のフィールドがあるので、

それらに当てはまる画像もしくは文字をあてはめるだけです。

UIの種類は、Text・Image・Buttonの三種類です。



【Text】
f:id:LightGive:20160125154944p:plain


【Image】
f:id:LightGive:20160125164744p:plain


【Button】
f:id:LightGive:20160125164749p:plain

f:id:LightGive:20160125165020g:plain

こんな感じに起動時に画像など、端末の言語に基づいて、
ローカライズされます!

こんな感じでアプリの国際化をしてみては・・・?

SpriteStateを表示させるだけでこんなに苦戦するとは思ってなかった...教えて下さった方、有難うございます!

何か間違っていたり、見当違いな事を書いている時は、gitでプルリクエスト又は個人的に教えて頂けると有難いです!

では!('ω')ノ



あ、ソースは下に載せときます。

gist.github.com

【Unity勇者の奮闘記】ヒエラルキーをソートするエディタ拡張作った

こんなことありませんか?

「座標のZ順にソートしたいなぁ」

「名前順にソートしたいなぁ」

安心してください、出来ますよ。


まず、いつものように

using UnityEditor

として、

BaseHierarchySortを継承します。

で、

public override int Compare(GameObject lhs, GameObject rhs)

Compareという関数があるのでオーバーライドします。

ここは、ソートされる時の比較関数で、ここに

どんな順番でソートしたいかを書けばその順番にソートされます

そのスクリプトをEditorフォルダに入れてやると、

作った関数がそのまま名前となり、リストで表示されます

こんな感じに表示されます

f:id:LightGive:20151219112721p:plain

github.com


プログラムはこんな感じです

gist.github.com

使用例としては、

f:id:LightGive:20151219123201p:plain

こんな感じのプロジェクトがあります

ヒエラルキーがバラバラなので、Y座標順にヒエラルキーが並んでほしいなぁ…

そんなとき!!

例えばYの降順にソートするとヒエラルキーが…

f:id:LightGive:20151219123028p:plain

f:id:LightGive:20151219123037p:plain

あら見やすい!

では('ω')

【Unity勇者の奮闘記】アプリのローカライズ

皆さんのアプリ、日本だけに留まってはいませんか??

日本よりも世界の方が遥かに大きいです!!
せっかくなので作ったアプリを全世界に届けましょう!

言語の取得方法ですが、下記の方法で取得可能です。

var language= Application.systemLanguage;

enumで入っています。

string langStr = Application.systemLanguage.ToString();
Debug.Log ("言語:" + langStr);

とすることででStringで取得することが出来ます

f:id:LightGive:20151211133038p:plain

SystemLanguageの中身は

  • Afrikaans
  • Arabic
  • Basque
  • Belarusian
  • Bulgarian
  • Catalan
  • Chinese
  • Czech
  • Danish
  • Dutch
  • English
  • Estonian
  • Faroese
  • Finnish
  • French
  • German
  • Greek
  • Hebrew
  • Hugarian
  • Icelandic
  • Indonesian
  • Italian
  • Japanese
  • Korean
  • Latvian
  • Lithuanian
  • Norwegian
  • Polish
  • Portuguese
  • Romanian
  • Russian
  • SerboCroatian
  • Slovak
  • Slovenian
  • Spanish
  • Swedish
  • Thai
  • Turkish
  • Ukrainian
  • Vietnamese
  • Unknown
  • Hungarian

と40カ国近くの言語が入っています!

string startText=゙゙:
switch (langStr){
case ゙English゙:
    startText=HelloWorld!!;
    break;

case "Japanese":
  startText=こんにちは世界!!;
    break;

case "Chinese":
  startText=你好天地!!;
    break;

case "French":
  startText=Bonjour monde!!;
    break;
}

などのようにすることで色んな言語に対応することができます!

せっかくですのでローカライズして世界にデビューしましょう!!

では('ω')

【Unity勇者の奮闘記】C#のクラスの継承について その2 

前回の続きで、RPGっぽいゲームを作るとしましょう。

そこで敵のプログラムを作ります。

ここで、継承を使うか使わないかで大きく変わってきます!

例えば、継承を使わない方法でやってみましょう

敵の情報は

・HP(体力)
・MP(魔力)
・STR(攻撃力)
・DEF(防御力)
・SPD(速さ)

としましょう


・継承を使わなかった場合

「そうだよ!継承なんて使わなくてもEnemyっていうクラス1つでいいじゃん!」

というAさんがいます。

そんなAさんは、まず、変数を作って、

行動する関数を作って…

using UnityEngine;
using System.Collections;

public class Enemy :MonoBehaviour{

	public string Name;
	public int Hp;
	public int Mp;
	public int Str;
	public int Def;
	public int Spd;

	public enum AttackType
	{
		Physical,
		Magical
	}

	/// <summary>
	/// 開始処理
	/// </summary>
	void Start()
	{
		Init();
	}

	/// <summary>
	/// 初期化
	/// </summary>
	void Init()
	{

	}

	/// <summary>
	/// ダメージを受けたとき
	/// </summary>
	void Damage(int _point,AttackType _attackType)
	{
		Hp -= _point;
		if (Hp <= 0)
			Death();
	}

	/// <summary>
	/// 攻撃するとき
	/// </summary>
	void Attack()
	{

	}

	/// <summary>
	/// 亡くなったとき
	/// </summary>
	void Death()
	{
		Destroy(this.gameObject);
	}
}

こんなかんじでしょうか?

そして、Editor上で編集して…

f:id:LightGive:20151207004502p:plain

f:id:LightGive:20151207004716p:plain

よし、スライムの完成だ!

これでどんどんモンスターを追加する分には問題ありませんが、

ゲームを作るうえで問題が出てきます。

例えば、こんな敵が出てきたとしましょう。

f:id:LightGive:20151207005425p:plain

f:id:LightGive:20151207004834p:plain

見るからに物理が効かなさそうですね…

じゃあこのプログラムを変えようとなりますよね?

Damageの関数を変えてみると…

	/// <summary>
	/// ダメージを受けたとき
	/// </summary>
	void Damage(int _point,AttackType _attackType)
	{
		if (_attackType == AttackType.Physical && Name == "ゴースト")
			_point = 0;

		Hp -= _point;
		if (Hp <= 0)
			Death();
	}


さらにこんな敵も出てきました

f:id:LightGive:20151207010024p:plainf:id:LightGive:20151207010031p:plain
f:id:LightGive:20151207010107p:plainf:id:LightGive:20151207010053p:plainf:id:LightGive:20151207010147p:plain

そうなったとき、こうなりますね?

	/// <summary>
	/// ダメージを受けたとき
	/// </summary>
	void Damage(int _point,AttackType _attackType)
	{
		if (_attackType == AttackType.Physical &&
          ( Name == "ゴースト1") ||
          ( Name == "ゴースト2") ||
          ( Name == "ゴースト3") ||
          ( Name == "おばけ1") ||
          ( Name == "おばけ2") ||
          ( Name == "おばけ3"))
		{
			_point = 0;
		}

		Hp -= _point;
		if (Hp <= 0)
			Death();
	}


いやあああああああああああああ

こうしてスパゲッティソースが出来上がっていきます。

あ、そうだ!変数を作ればいいんだ!

public bool isGhost;

と変数を追加して…

        /// <summary>
	/// ダメージを受けたとき
	/// </summary>
	void Damage(int _point,AttackType _attackType)
	{
		if (_attackType == AttackType.Physical && isGhost
		{
			_point = 0;
		}

		Hp -= _point;
		if (Hp <= 0)
			Death();
	}

「これで問題ないじゃん!」

と、安心したそこのあなた、

RPGをなめてはいけません。

他にもたくさんあります

・空中に浮いている敵
・一定ダメージ以上は効かない敵
・魔法攻撃だとダメージが2分の1になる敵
・魔法攻撃を無効にする敵
・物理攻撃をしたときカウンターをしてくる敵
…etc

などと変数を増やしていくと…

f:id:LightGive:20151207012034p:plain

と、このようにステータスを決める画面はこんな感じで、

Damageの関数はというと…

	/// <summary>
	/// ダメージを受けたとき
	/// </summary>
	void Damage(int _point,AttackType _attackType)
	{
		if (_attackType == AttackType.Physical && isGhost)
			_point = 0;

		if (isFly && _attackType == AttackType.Physical)
			_point = 0;

		if (isAttackInvalid && invalidPoint > _point)
			_point = 0;

		if (isMagicHalf && _attackType == AttackType.Magical)
			_point /= 2;

		if (isMagicInvalid && _attackType == AttackType.Magical)
			_point = 0;

		if (isMagicCounter && _attackType == AttackType.Magical)
			Attack();

		Hp -= _point;
		if (Hp <= 0)
			Death();
	}


いやあああああああああああああ

いや、酷いですね…

大分オーバーにやりましたが、

一体の敵のステータスを決めるだけでもこんなにたくさん

値があるのではどれが何か分からなくなってしまいますね…

これが継承を使うと綺麗になります!

継承をつかった方法は次に!

では('ω')ノ

【Unity勇者の宿屋】 Android USBドライバーの入れ方

久しぶりにスマホ変えたのでADBコマンドでAPKをインストールしようとしたら

USBドライバ入ってなくて少し手間取っていたのでメモしておきます

1.Googleで 「自分の機種名+ドライバー」みたいな感じで検索して

大体の機種はダウンロードする所が出てくると思います。

それをどこでもいいので分かりやすい所にダウンロードしてください。

ここは自分で頑張って探してください。('ω')


自分のXperiaだとこんな感じのページ
f:id:LightGive:20151031181438p:plain



2.ダウンロードしたファイルを圧縮されているなら解凍して、

そのファイルをあまり動かさない場所などに入れてください。


3.「コントロールパネル」を開いて、「デバイスマネージャ」を開き、

ここから「ほかのデバイス」Android ADB Interface」を右クリックしてください。

それで、「ドライバソフトウェアの更新」を選択します。


4.ウィンドウが表示されたら、二つの選択肢の下の

「コンピューターを参照してドライバーソフトウェアを検索します」

を選択して、ダウンロードしたファイルを解凍したフォルダを選択して、

「OK」を押します。「サブフォルダも検索する」のチェックも忘れないように。

そしてインストールが完了します!

早速確認してみましょう

コマンドプロンプトを開いて…

f:id:LightGive:20151031184109p:plain
f:id:LightGive:20151031184140p:plain
f:id:LightGive:20151031184127p:plain

これだけでアプリがインストールできるようになります!



余談ですが、XperiaZ5買いました!!!


\ワーーーー!!/

とりあえず使ってみた感じは悪い感じはしないですね

色は白にしようとしてたんですが白よりシルバーって感じがしたので

ぎりぎりで黒に変えました!(笑

f:id:LightGive:20151031180602j:plain

わぁー!!

いいわぁ…

すごくいいわぁ…

心配だった熱問題も今のところは大丈夫で、ゲームをすると軽く

あったかくなる感じですね!

予想よりは全然熱くなかったので良かったです!

(ただし自分の財布は冷たい模様)

是非これからもアプリ開発を進めたいと思います!

では('ω')

【Unity勇者の奮闘記】電卓作った

エディタ拡張で電卓作りました!

 

f:id:LightGive:20151024123528p:plain

 
プログラムやってると電卓使うことあるんですがWindowsで電卓出すの面倒なので作りました!
 
式をボタンで入力して…

f:id:LightGive:20151024123604p:plain

 
=で計算できます

f:id:LightGive:20151024123638p:plain

 
四則演算しかないシンプルなやつですがどうぞ。
 
プログラムは結構ゴリゴリ書いたのでスマートではないのと、
キー入力は出来ないですが、一応できたので、どうぞ!
 
あれ...そういえば小数点って制御したっけ…

f:id:LightGive:20151024123711p:plain

 

f:id:LightGive:20151024123729p:plain

 
あっ…(汗)
 
あなたは何も見ていない、いいね?
 
ゲームも設計は大事だけど、それ以上にツール系って設計大事ですね('ω')
これからの課題は設計ですね...
 
とても暇で、修正してくれる方はプルリクエスト送ってくださいね
 
Git
 
ソースはこんな感じ

gist.github.com

 
参考にしたプログラムはこちら
では('ω')