【Unity】エクセルのデータをScriptableObjectに格納する方法
はじめに
ゲームを作っているとデータなどをエクセルで管理したい場合があると思います。
例えばレベルごとの強さなどのデータです。
もちろんスクリプトの中に直接書くこともできますがそれだと変更などをするのが大変です。
またプランナーとエンジニアで仕事を分担している時などもデータをエクセルで管理すると楽です。
今回はエクセルのデータをScriptableObjectに格納してそれを参照するという方法でやっていきたいと思います。
NPOIのインストール
https://www.nuget.org/packages/NPOI/
ここのページに移動して、右にあるDownload packageをクリックしてインストールしてください。
そうすると「npoi.2.4.1.nupkg」というファイルが得られます。
多くの人はそのままクリックしても、開くためのアプリケーションがないと言われて開けません。
ではどうするのかというと拡張子をzipに変えればいいだけです。
というのもnupkgというのはzipの親戚のようなものだからです。
そのため拡張子をzipに変えてあげることで解凍できるようになります。
そうするとこのようになります。
必要なのはllbフォルダの中にあるnet20というフォルダです。
これをunityのAssetsの下に置きます。
これで準備完了です。
ScriptableObjectの実体を作る
ファイル名はSampleSO.csとしておきます。(SOはScriptableObjectの略です)
このファイルはどこにおいても構いません。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class SampleSO : ScriptableObject { public List<float> power; }
これだけです。
保持しておきたい値を今回はリストで保持します。
scriptableObjetを作成するスクリプトを書く
先ほどScriptableObjectの実体を作ったのでそれを元にしてScriptableObjectを作成するスクリプトを書きます。
Asset以下に「Editor」という名前でフォルダを作り、そこの中にCreateScriptableObject.csという名前のファイルを作ります。
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEditor; public class CreateScriptableObject { private static SampleSO instance; [MenuItem("ScriptableObject/Create PowerAsset")] static void CreatePowerAsset() { //インスタンスを生成 instance = ScriptableObject.CreateInstance<SampleSO>(); //アセットを作成 AssetDatabase.CreateAsset(instance, "Assets/SableObjects/Powerdata.assetcript"); AssetDatabase.SaveAssets(); } [MenuItem("Editor/ReadExcel")] public static void Main() { instance.power = ExcelRead.ReadBookInfo("Assets/Excel/sample.xlsx"); EditorUtility.SetDirty(instance); AssetDatabase.SaveAssets(); } }
関数の上に[MenuItem("ScriptableObject/Create PowerAsset")]とありますが、これは
こんな感じで上にScriptableObjectといった項目ができて、そこを押すことで任意の関数を実行させることができます。
なおスクリプトを書いたあと一回実行しないと現れません。
まずは先ほどのSmapleSOのインスタンスを作ります。
そしてそれを元にアセットを作ります。
このアセットの中にデータが入っているので見失わないようにしましょう。
そのため今回はAssets以下にScriptableObjectsというフォルダを作って、その中に保存しています。
Main関数ではインスタンスのpowerにExcelReadファイルのReadBookInf関数を使って読み取った値を入れます。
これに関しては次に実装します。
そして保存しています。
SetDirty(instance)をしないと変更が検知されません。
エクセルで読み込む
ExcelRead.csとしてEditorフォルダの中に入れます。
中身はこんな感じです。
using System; using System.IO; using System.Globalization; using UnityEngine; #if UNITY_EDITOR using UnityEditor; #endif using NPOI.HSSF.UserModel; using NPOI.XSSF.UserModel; using NPOI.SS.UserModel; using System.Collections.Generic; using System.Collections; public class ExcelRead : AssetPostprocessor { public static List<float> ReadBookInfo(string path) { FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); IWorkbook book = new XSSFWorkbook(fs); List<float> power = new List<float>(); ISheet sheet = book.GetSheetAt(2); for (int i = 2; i < 100; i++) { IRow row = sheet.GetRow(i); ICell cell = row.GetCell(2); power.Add((float)cell.NumericCellValue); } return power; } }
ReadBookInfo関数はパスを受け取ってそこに書いてある値をリストにして返します。
GetCell()の値を変えることで好きな場所の値を取ってくることができます。
エクセルのシートの二枚目を参照しているのもわかるともいます。
そして2行目から100行目までの二列目をリストに入れていっています。
使い方
さてこれで実装は終わりなので使い方を書いていきたいと思います。
まずは一回ゲームを実行します。(すぐに終了しても大丈夫です。)
すると先ほど行ったように上にScriptableObjectとEditorというのができます。
まずはScriptableObjectのCreate PowerAssetをクリックします。
すると、指定した場所(今回はAssets/SableObjects)にScriptableObjectができます。
今のぞいてみても何もデータが入っていないことがわかります。
次にEditorのReadExcelをクリックして、データを読み込みます。
すると先ほどからだったところにデータが入っていることがわかると思います。
もちろん元となるエクセルデータは指定の場所に置いておいてください。
参照の仕方
下のように書いてインスペクタにドラッグ&ドロップしましょう。
[SerializeField] private SampleSO sampleSO;
としてsampleSO.powerとすればいいです。
【ブログ月次報告】【7ヶ月目】ブログモチベが低下!!??
ブログ報告6ヶ月目ということでいつものブログ月次報告をやって行きましょう!
先月は初めて本格的にブログをやり、1ヶ月で19記事書きました。
するとpv数もグッとあがりました。
そんな感じで6ヶ月目を迎えましたがどうなったのでしょう??
みていきましょう。
現在の状況
- 読者数 16→17
- ユーザー数 209→372
- pv数 354→596
- 記事数 42→50
左側は先月(6ヶ月目)の時点での数字です。
右側が7ヶ月目が終了時点でのものです。
記事数はその月が終わった時までの総計です。
1ヶ月で書いた記事の数でないので注意してください。
先月の末に立てた目標は
- 読者数 20
- ユーザー数 300
- pv数 500
- 記事数 42→60
こんな感じでした。
読者数は伸びにくいと思っていたので目標も低めにしていましたが、それでも達成できませんでした。
どうやったら読者数が伸びていくのか誰か教えてくださいw
その代わりと言っては何ですがグーグル検索からの伸びが素晴らしく、ユーザー数、pv数共にかなり伸びてきました。
12月に書いた記事がやっと検索上位に上がってたためです。
やはり3ヶ月くらいしないと、上がらないものなんですね。
今月の後半から急激にブログを書くモチベーションが下がってしまい、なかなか更新することができませんでした。
3月はまた忙しくなるのであまり書けないかもしれませんが、何とか時間を見つけて書いていけたらなと思います。
8ヶ月目の目標
- 読者数 20
- ユーザー数 500
- pv数 750
- 記事数 50→60
これが次の月の目標です!
今いい感じにpv数とかが伸びていっているのでこの勢いを保っていきたいと思います!
読者登録等のびるとやる気が出るのでぜひ登録お願いします!
Noteshelf2の使い心地をレビュー!書くのが楽しくなる
以前こちらの記事でも紹介したように17000安くiPadProを手に入れました。
turedureengineer.hatenablog.com
今回はそのiPadProで使っているノートアプリ、Noteshelf2についてレビューを書いていきたいと思います。
Noteshelf2とは??
iPadProでノートを取るためのアプリです。
価格は私が買ったときには1200円しました。
有料アプリを買うのは初めてだったので最初は戸惑いましたが、買ってよかったと感じいています。
びっくりするくらい書くことが楽しくなりました。これだけでお金を払った価値があると思います。
ノートを普段から大量に使う人にとっては、1200円で今後ノート代がかからないと思えばかなりいい買い物だと思います。
- 出版社/メーカー: SHANSHUI
- メディア: エレクトロニクス
- この商品を含むブログを見る
実際のノートを超えている点
Noteshelf2はただノートをデジタルに持ってきただけのものではありません。
実際のノートを超えた利点もたくさんあります。
無限にノートを作ることができる
これはデジタルなのだから当たり前ですが大きな利点の一つです。
実際のノートなら一冊200〜300円しますがアプリの中で何個ノートを作ってもタダです。
これは日々大量にノートを消費する人にはぴったりだと思います。
またデジタルだから容量の制限はあるだろと思う人もいると思います。
これに関してもほとんど気にしなくていいと言えます。
iPadProの一番低い容量は64GBですがこれでも十分やっていけます。
また最近はクラウドにデータをバックアップするというのも流行っているのでそうするのも一つの手です。
Noteshelf2ではEvernoteやOneDrive、iCloud,Dropboxなど様々なオンラインストレージに保存することができます。
書き心地
よく言われるのはタブレットに文字を書くのは滑って書きにくいというものです。
最近ではペーパーライクフィルムといって春とタブレットの書き心地が紙のようになるものがあります。
私は使ったことはありませんがこれを貼るとかなり書きやすくなるらしいです。
しかし私はペーパーライクフィルムを選択しませんでした。
というのもペーパーライクフィルムは適度な摩擦を与えているためお縁先がすり減りやすいからです。
また見え方がガラスフィルムに比べて悪いということもあります。
以上の理由から私はガラスフィルムを選択しましたがこれがかなりよかったです。
一般的には滑るから書きにくいと言われますが、それが逆に私にはサラサラとかけて気持ちが良かったです。
もちろん実際の紙の書き心地とは違いますが、3日くらいiPadProで書いていると慣れてこっちの方が素早くかけていいとすら思います。
ただこれは絵を描くためにiPadProを買おうと思っている人には通じないと思うので気をつけてください。
絵を描きたい人はペン先がすり減りますがペーパーライクフィルムを貼った方がいいでしょう。
検索機能
これは間違いなく実際のノートにはないものです。
ノートのどこに何をかいたなんかは覚えていないと一からめくって確認する必要があります。
しかしNoteshelfは手書き文字であっても検索でヒットするのでいちいち探す手間が省けます。
こんな感じでハイライトで表示されます。
色々なペンがある
ペンとノートを使って描くのには当たり前ですが鉛筆、ボールペンなど様々なものが必要になります。
そのためいつも筆箱の中がパンパンという人も多いでしょう。
しかしこのアプリ一つあればボールペン、鉛筆、万年筆、蛍光ペンなど様々なものを使うことができます。
また色も自由に変えることができるため自分の好きなようにノートを取ることができます。
小さくて申し訳ないですがこんな感じです。
特に気に入っているのは鉛筆です。
これで描くことで実際の紙に書いているような優しい感じの文字になります。
神に書くことが好きな人も満足できると思います。
iPadProを持つ人入れるべき!!
Noteshelf2は書くことを楽しくさせてくれる魔法のアプリです。
iPadProを持っている人は絶対に入れるべきです!!
これだけのためにiPadProを買ってもいいのでは?とすら思いますw
学生でノートを取るときにも使えるし、普段のメモなど様々なことに使えます!
Apple iPad?Pro (11インチ, Wi-Fi, 256GB) - スペースグレイ
- 出版社/メーカー: アップル
- 発売日: 2018/10/31
- メディア: Personal Computers
- この商品を含むブログを見る
【図解】ベクトル解析に出てくるdiv,rot,gradとは?
今回は大学に入ったら出てくる記号について話していきたいと思います。
div(発散)
divは以下のように定義されます。
ただしuはベクトル関数であるとします。
この式はuがどれだけ湧き出しているかを表します。
いきなりそんなことを言われてもわからないと思うので図を参考にして考えていきましょう。
位置(x,y,z)に微小な箱があるとします。
まずは簡単のためにx方向のみを考えていきます。
この箱に入っていくのは図を見てわかる通りです。
そして出ていくのは
これにそれぞれ通る面の面積をかけるのでこの微小な箱にx方向から出ていくuの量は
となります。
同様にy,z方向についても考えて、この箱の全方向から出ていくuの量は
となります。
そして単位体積あたりを考えるのでで割ります。
すると、
これを見てわかる通りを考えると各項が微分の形になっていることがわかると思います。
よって
となります。
rot(回転)
rotは以下のように定義されます。
これもまずは図を見て理解していきましょう。
rotとはrotationの略です。
つまり回転を意味しています。
上の図のように歯車があってその周りを流れるuがどれだけ歯車を回すかということです。
そしてイメージしてみたらわかるようには歯車を半時計回りに回し、は歯車を時計回りに回します。
よってy方向のuは合計で
の極限を考えて、だけ反時計回りに回します。
次にx方向のuについて考えます。
これを見てわかる通り今度はは歯車を時計回りに回し、は歯車を半時計回りに回します。
先ほどと同じように合計で
の極限を考えて、だけ反時計回りに回します。
合計でz方向にとなります。
あとはx,y方向にも同じことを考えるだけです。
uを水の流れのように考えて歯車の回転を考えることでイメージがしやすくなると思います。
grad(勾配)
gradは以下のように定義されます。
今までの関数uはベクトル関数でしたが今回のfはスカラー関数であることに注意してください。
これは今までの二つから考えるとかなりわかりやすいと思います。
は見覚えがあると思いますがx方向の傾きを表します。
つまりx,y,z方向のそれぞれの方向について傾きを並べたものになっています。
17000円引きでiPadProとApplePencilを買う方法
最近ずっと悩んでいたiPadPro11インチを購入しました!
私はApple製品が好きでiphoneとmacbooAirを持っています。
そんなApple製品大好きな自分が今回はiPadPro購入に至った経緯について書きたいと思います。
学生が17000円安くipadProを買う方法
これが購入を迷っていた自分の背中を押しました。
なんと今なら学生に限りますが、iPadProを17000円引きで購入することができます。
どういう仕組みかというとまず学生ならば常時5000円引きで購入することができます。
こちらの学生向けストアから買うことができます。
「新学期を始めよう」キャンペーン - 学生割引 - 教育 - Apple(日本)
そして今新学期に向けた準備としてMac製品を買うと18000円のギフトカードが、iPadProを買うと12000円のギフトカードがもらえます。
このギフトカードでApple Pencilを買うことで5000+12000=17000引きになるということです。
もちろん直接安くなるわけではないですが、Apple Pencilやスマートキボードフォリオを買うと思うので実質値引きと同じです。
そんなの両方いらないという人でもアップルストアで売っているものなら何にでも使えます。
Apple iPad?Pro (11インチ, Wi-Fi, 256GB) - スペースグレイ
- 出版社/メーカー: アップル
- 発売日: 2018/10/31
- メディア: Personal Computers
- この商品を含むブログを見る
欲しかった理由
単純に美しいから
私はもともとタブレットを持っていたわけでも、めちゃめちゃ欲しかったわけでもありませんでした。
しかしながらこのiPadProを見たら書いたい!と思いましたw
ホームボタンがなくなりベゼルがなくなり、本当に一つの板のようになった姿に一目惚れしたのです。
そこからiPadについて調べていき、実際に役に立ちそうだということを確信し購入に至りました。
ペーパーレスに憧れた
大学の授業でノートを取るときにiPadで書いているとかっこよくありませんか?w
もちろんかっこいいからだけではなくて、実用的な面から考えてもiPadでノートを取ることはいいと思います。
まず第一に管理が非常に楽です。
検索などもできるノートアプリがたくさんあるためいちいちあのノートはどこにいったっけなどと探したりする手間が省けます。
また図や写真などを貼るのも容易になるため理解も深まるはずです。
長く使えそうだと思った
このiPadProはAppleが次世代のコンピュータとして売り出しているのもあり非常にスペックが高いです。
こんなにスペックが高くなくていいから安くしてくれと思う人もいるかもしれません。
私も最初はそう思っていました。
しかし逆に考えるとこれだけスペックが高いからこそ長く使えるはずです。
3年使うとしたら一年で3万円、5年使うとしたら一年あたり2万円です。
そのお金で便利さが得られるのなら安いとさえ思いました。
エレコム iPad フィルム iPad Pro 12.9 2017年モデル / 2015年発売 iPad pro 12.9 ペーパーライク 反射防止 TB-A17LFLAPL
- 出版社/メーカー: エレコム
- 発売日: 2017/06/07
- メディア: Personal Computers
- この商品を含むブログを見る
エンジニア必見の本、リーダブルコードを読んでみた!
今回はリーダブルコードという本のレビューみたいなものを書いていきたいと思う。
エンジニアにどんな本を読んだらいいですか?と聞くと10人中9人はこの本をあげると思う。
それくらい有名な本である。
ネットにもいっぱいこの本についての記事が上がっているが、いい本だと思ったので私にも紹介させてくださいw
そもそもリーダブルコードとは何か?
リーダブルコードとは可読性が高いコードのことです。
簡単にいうと「読みやすいコード」ということです。
アプリやウェブサイトなど大きなものになってくると複数人で開発します。
そのため他人のコードを頻繁に見ます。
この時に読みにくいコードであると意味を理解するのに時間がかかり、無駄が多いです。
では、一人で趣味で開発している時などは読みやすいコードというものを意識しなくても良いのでしょうか?
答えはノーです。
なぜなら1ヶ月後の自分は他人と同じだからです。
時間が経った時に直したりしやすいようにたとえ一人で開発していたとしても読みやすさというのは意識する必要があります。
中身について
さて気になる中身ですがかなり具体的に書かれています。
たとえばコメントについてだけで2章、20ページくらい書いてあります。
ただコメントは多いほうがいいとかいうのではなく、具体例を出してこういったコメントはすべきで、逆にこういったコメントはすべきではないということが書かれています。
とにかく具体例が多いというのがこの本の特徴だと思います。
具体例に使われている言語ですが、Javaが多い気がします。
だからと言ってJava以外の言語を使う人にはお勧めできないかというとそんなことは全くありません。
プログラミングの基本for文とかはどの言語でも同じです。
Java特有の何かがあったりとかはないので安心してください。
他の言語を普段使っている人も問題なく使うことができます。
かくいう私も普段はUnityでのC#,Swiftがメインですが理解できないなどということはなかったです。
どんな言語を使っている人にとってもためになると思います。
読んでみた感想
以前自分でも読みやすいコードとは何かとはまとめました。
一応プログラミングを一年以上やっているので自分の中でどういうコードが綺麗でどういうコードがダメかわかっているつもりでした。
そのため今更綺麗なコードを書くためには?なんてことを題材にした本は読む必要ないと思っていた時期もありました。
しかしあまりにもいろいろなところで賞賛されているので一度見てみようと購入を決意しました。
結論は買ってよかったです。
理由の一つ目として、これだけ体系的に綺麗なコードについて書かれているものはありません。
読みやすいコードを書くことは動くコードを作ることと同じように大事なため、この本が非常に役立ちます。
二つ目として痒いところに手が届いていると思いました。
意識はしていなかったけど普段からしていたことや、全く知らなかったものなどそういったところをうまくついているなと思いました。
自分は綺麗なコードをかけていると思う人にも読んでもらいたいです。
必ず新しい発見があると思います。
お勧めできるか?
間違いなくお勧めできます。
2400円と少々お高めではありますが、これから先の基礎を固めるにはもってこいだと思います。
未来への自分の投資だと思って買いましょうw
リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)
- 作者: Dustin Boswell,Trevor Foucher,須藤功平,角征典
- 出版社/メーカー: オライリージャパン
- 発売日: 2012/06/23
- メディア: 単行本(ソフトカバー)
- 購入: 68人 クリック: 1,802回
- この商品を含むブログ (140件) を見る
【Unity】UIの基本(Canvas,描画順,アンカー,ピボット)を徹底解説してみる
UIの基本
右上の「create」からUIを選択し「text」などとすることでUI要素を作ることができます。
すると同時にCanvasとEventSystemというものができると思います。
UIは全てCanvasの子要素として作られます。
なお、すでにUI要素を作成しているときはすでにできているcanvasのなかにUIが作られ、EventSystemは作られません。
eventsystemとはボタンのクリックなどのイベントを感知するためのものです。間違って消さないようにしましょう。
デフォルトではUIの描画モードはScreen Space-Overlayになっています。
これはキャンバスの位置にかかわらずキャンバスが画面いっぱいに移されるというものです。
上の画像を見るとわかる通り、UIであるテキストとcubeの大きさはシーン上では全く違いますが、ゲーム画面では同じように見えます。
イメージとしてはUI以外のものを写すものと、UIだけを常に画面いっぱいに写すカメラが二つあって、その二つの映像をゲーム画面では足し合わせて見ている感じです。
UIの描画順
描画の順番はヒエラルキー上で上にあるものほど奥に描画されます。
下にあるものほど手前にきます。
描画の順番を変えたい場合、zの値を変えることで実現できます。
手前に描画したい場合、zの値をマイナスの値にすればいいのです。
これによりゲーム画面で見たときの大きさが変わることはないので安心してください。
RectTransform
以前こちらの記事でも言ったように子要素のTransformはローカル座標(親要素との相対座標)を表します。
UI要素はTransformではなくRectTransformがついています。
しかしRectTransform自体がTransformを継承したものなので大きくは変わりません。
大きな違いとしてアンカーとピボットの存在があるのでそれについて詳しく見ていきましょう。
アンカー
違いとしてはアンカーの存在があります。
アンカーは錨という意味がありますがまさしくUIを止めておくために必要なものです。
RectTransformの左にある十字の的のような所をクリックすると以下のような画面が見えます。
デフォルトでは真ん中のものになっています。
これは親要素のど真ん中(縦方向の真ん中かつ横方向の真ん中)を基準とすることを意味します。
図を見てわかると思いますが真ん中にある10このものはそれぞれ親要素のどこを基準とするかということを示しています。
アンカーはシーン上ではこう見えます。
ここを直接動かす書くこともできますが、さっきのようによく使うアンカーの位置はすでに用意されているので直接動かすことはあまりないでしょう。
アンカーの所をクリックしてシーン場で見えるアンカーがどのように変わっていくか一度見てみるとよくわかると思います。
ピボット
アンカーの下にピボットがあると思います。
これは自分自身の基準のことです。
例えばピボットがx=0,y=1となっていたら自分自身の左上が基準んということです。
x=0.5,y=0なら底辺の真ん中が自分の基準となります。
Canvas直下にtextがあってそのrectransftomがこの写真のようになっているとします。
まず親の基準がアンカーを見て上辺の真ん中ということがわかります。
そしてピボットを見ることで自分自身の基準がわかり、自分自身のど真ん中(縦も横も真ん中)だとわかります。
つまりこれは自分の中心を親オブジェクトであるcanvasの上辺の真ん中から下に433.5下に行ったところにするという意味です。
終わりに
UI特にrecttransformのアンんかーやピボットは最初は違いなどがわかりにくいと思います。
このブログを参考にして頑張ってみてください!