【Unity】 Random.Rangeに気をつけろ!
目次
概要
UnityのRandom.Rangeが引数intとfloatのオーバーロードで挙動が違うので、「気をつけろ!」といった内容の記事になります。
散々痛い目にあったので、忘れないようにこの記事を書くことにしました。
Random.Rangeとは?
// float Random.Range(float min, float max); // int Random.Range(int min, int max);
「minからmaxの間の値をランダムに返す」といった機能の関数です。
何に気を付ける?
Random.Rangeですが、floatとintの比較をしながら説明したいと思います。
floatの場合
下記の「_ranNum」には0.0〜1.0の間のランダムな少数が入る
float _ranNum = Random.Range(0.0f, 1.0f);
intの場合
下記の「_ranNum」には0〜9の間のランダムな値が入る
int _ranNum = Random.Range(0, 10);
「んっ?0~10で指定したのに0~9が返ってくるだと?」
これが今回のRandom.Rangeの気を付けなければいけないところです!
floatだとmaxの値までが返ってくるのに対して
intは「max - 1」が返ってきます。
なぜmax - 1?
これは個人的な解釈ですが、配列などのLengthやListのCountの値を直接使用するためではないかと思います。
int[] _array = { 0, 1, 2, 3, 4, 5 }; int _index = Random.Range(0, _array.Length); // _array.Length - 1と書かなくて良い int _value = _array[_index];
誰かの参考になれば幸いです。
【Unity】 PlayerPrefsをエディターで削除
目次
PlayerPrefsとは
前回PlayerPrefsについて記載しましたので、よろしければ一緒にご覧いただければと思います。pandoraxssscan-929.hatenablog.com
削除の仕方
Editor>Clear All PlayerPrefsを押すだけで、現在保存されているPlayerPrefsの情報をクリアすることができます。
【Unity】 セーブ/ロードを実装 PlayerPrefs
目次
Unityでデータを保存するには?
ゲームのスコアなどを「セーブ・ロードしたい」といったことありませんか?
その際に使用できるのがUnityの「PlayerPrefs」という機能です!
スコアなどの単純なデータであれば、PlayerPrefsを使用できます。
PlayerPrefsで保存できる型
下記の3つの型でセーブ・ロードが可能です。
- int
- float
- string
セーブ
値の設定
- int : PlayerPrefs.SetInt("保存キー", 保存するデータ);
- float : PlayerPrefs.SetFloat("保存キー", 保存するデータ);
- string : PlayerPrefs.SetString("保存キー", 保存するデータ);
※これを呼んだだけではまだ値はディスクには書き込まれていない。
ディスクへの書き込み
PlayerPrefs.Save();
※ 呼ばなくてもアプリ終了時に保存されるが、
アプリがクラッシュした際は保存されないようなので定期的に保存した方が良さげ。
使用例
// int型で保存 int score = 999; PlayerPrefs.SetInt("SCORE", score); // float型で保存 float time = 1.0f PlayerPrefs.SetInt("TIME", time); // string型で保存 string name = "Hoge"; PlayerPrefs.SetInt("SCORE", name); // ディスクへの書き込み PlayerPrefs.Save()
ロード
- int : PlayerPrefs.GetInt("保存時のキー", 値が保存されていない際の値);
- float : PlayerPrefs.GetFloat("保存時のキー", 値が保存されていない際の値);
- string : PlayerPrefs.GetString("保存時のキー", 値が保存されていない際の値);
// int int score = PlayerPrefs.GetInt("SCORE", 0); // float float time = PlayerPrefs.GetFloat("TIME", 0f); // string string name = PlayerPrefs.GetString("NAME", "NONE");
削除
キーを指定して削除
PlayerPrefs.DeleteKey("保存時にしてしたキー");
全削除
PlayerPrefs.DeleteAll();
// キーを指定して削除 PlayerPrefs.DeleteKey("SCORE"); PlayerPrefs.DeleteKey("TIME"); PlayerPrefs.DeleteKey("NAME"); // 全削除 PlayerPrefs.DeleteAll();
【おすすめ商品】ジェットウォッシャー ドルツ
目次
紹介
みなさん、ご飯食べた後の口の中気になりませんか?
そんなみなさんにおすすめの商品がこちら!
「パナソニックのジェットウォッシャー ドルツ」
歯磨きも大事ですが、これを使用した後の口の中なのスッキリ感は半端ないです。
自分はこの商品のレビューをみたときは「水で洗い流した程度でそんな変わるものか?
」と思っていましたが、いざ購入して使用してみるとビックリでした。
口臭や食後の口内が気になる方は是非試してみてください。
【Unity】Unity2019.40f1 iOS 上書きビルドできない?
概要
Unity2019.4.0f1を使用していた際にUnityでプラットフォームをiOSでビルドする際に
上書き(Append?)でビルドをすると下図のようなエラーが表示され何故か失敗するということがありました。
エラーの詳細
DirectoryNotFoundException: Could not find a part of the path '/ビルド先のパス/Test/Unity-iPhone/Images.xcassets/LaunchImage.launchimage'
「'LaunchImage.launchimage'というディレクトリがないよ」と言われているようです。
解決方法
「Test/Unity-iPhone/Images.xcassets/」の下にLaunchImage.launchimageというフォルダを作成すれば解決します。
ただ、ビルドする度に作成しないといけないので、応急処置程度にしかなりません。
余裕があればビルド時にフォルダを自動で作成するような拡張を作りたいですね。
【Unity】URLスキームの設定(iOS)
目次
ディープリンクの実装についても書いているので、 合わせてこちらもどうぞ! pandoraxssscan-929.hatenablog.com
URLスキームとは?
「URLの先頭部分『~~://』のこと、もしくはURLの先頭部分『~~://』に名前を指定してアプリを開くこと」
出典 : URLスキームとは 「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典
と書かれています。
今回は後者の
URLの先頭部分『~~://』に名前を指定してアプリを開くこと
に当てはまります。
設定方法
それでは設定していきましょう。
- Project Settings>Playerを開く
- Other Settingsを開く
- Supported URL Schemesに設定する
これで外部からこのスキームを叩くと設定したアプリを起動することができる。
【Unity】ディープリンク実装
目次
概要
Webページで、 AppStoreとかGooglePlayStoreのアイコンがあってタップすると
- アプリがインストール済みならアプリ起動
- 未インストールならストアへ飛ばされる
みたいなやつ見かけないですか?
あれを簡易的にC#だけでアプリ上で実装するためのコードです。
このスマホアプリやWebページからアプリに飛ぶことを「ディープリンク」とか「ディープリンキング」と呼ぶらしいです。
詳しく知りたい方は調べてみてください。
きっかけ
この機能を実装しようと思ってネットで色々調べても、難しそうなやつしか出てこなかった
- AndroidならUnity上でJavaを書く
- iOSならObjective-Cを書く
みたいなやつしかなかった。
どっちもハードルが高そうだったので「C#だけでなんとかならんのか?」
と悩み考え出したコードです。
(凄そうに聞こえますが、大したことはやってませんw)
※間違っている可能性がございます、ご使用される際は注意してご利用ください。
コード
using System.Collections; using UnityEngine; /// <summary> /// ディープリンク用テストクラス /// </summary> public class Test : MonoBehaviour { private const string urlScheme = "line://"; // 開きたいアプリのURLスキーム // アプリのストアへのリンク(ブラウザで検索したやつで大丈夫だった) #if UNITY_EDITOR private const string storeUrl = "https://play.google.com/store/apps/details?id=jp.naver.line.android&hl=ja"; // エディターではGooglePlayへのリンク #elif UNITY_IOS // --- iOS用のストアへのリンク private const string storeUrl = "https://apps.apple.com/jp/app/line/id443904275"; #elif UNITY_ANDROID // --- Android用のストアへのリンク private const string storeUrl = "https://play.google.com/store/apps/details?id=jp.naver.line.android&hl=ja"; #endif /// <summary> /// 別アプリへの遷移処理(これを呼び出す) /// </summary> public void TransitionAnotherApp() { // URLスキームを元に別アプリへ遷移 Application.OpenURL(urlScheme); // 上記に反応がない場合は一定時間後にストアへ飛ばす StartCoroutine("TransitionStore"); } /// <summary> /// ストアへ飛ばすためのコルーチン用関数 /// </summary> private IEnumerator TransitionStore() { yield return new WaitForSeconds(1f); Application.OpenURL(storeUrl); } /// <summary> /// アプリが起動しているかの /// </summary> /// <param name="pause">アプリケーションが起動しているか?</param> private void OnApplicationPause(bool pause) { // アプリに復帰したらストアを開くコルーチンを止める。 if (!pause) { StopCoroutine("TransitionStore"); } } }
コードの説明
サンプルコードはLINEを例に作っています。
ざっくり説明すると
- LINEがインストールされていれば開く
- インストールされていなければ、OSに対応したストアを開く
※iOS・AndroidともにUnityで作ったテスト用のアプリは起動しました。
LINEのURLスキームについて
最後に
今回はアプリを開く側の解説だったので、今度は開かれる側の設定を紹介できればと思います。
間違いや、「もっとこうした方が良い」などご意見がありましたら、
気軽にコメントしてください。