- 投稿日:2020-02-14T19:46:09+09:00
Unity で暗号化した SQLite (SQLCipher) を使うやり方のまとめ
暗号化はいらないときの基本
SQLite をシンプルに使うやりかたは、前の記事に書いたとおりです。
暗号化が必要になったとき
実際にアプリを公開するときに、DB ファイルの中身があっさり書き換えることができるのは、ちょっと……って思うなら暗号化がベスト。でも、これは自分で SQLite3 のライブラリーをコンパイルする道を選択したのと同じことだと思います。
GitHub - SQLiteUnityKit を利用しつつ Unity で SQLite を使うとき、暗号化するなら JAVA なんかがライブラリーの中に入ってくると邪魔になります。このキットはシンプルに DllImport で関数を呼び出してるだけです。
なので、なるべくシンプルに dll と so ファイルを作る必要があると思います。(x86/x64 win/android の4パターン)
このあたりを記事にまとめたので、ショートカットをメモ。
- Unity SQLiteUnityKit 暗号化 SQLite3 を Windows で利用する(DLL コンパイル)
- Unity SQLiteUnityKit 暗号化 SQLite3 を Android で利用する(.so コンパイル)
ビギナーなので、間違いがあったらすいません。(おしえてください)このあたりの記事は 2020/02 時点では、数が少ないので、もうすこしネタが増えると嬉しく思います。
- 投稿日:2020-02-14T12:59:46+09:00
c# フォームのサイズ変更について。
C#でプログラミングをしております。
フォームを拡大、縮小した際に、
フォームに配置されている
3つの同じ大きさのボタンも、
フォームに追従するように拡大、縮小させるにはどのようにプログラミングすれば実現可能でしょうか。AnchorプロパティやDockプロパティを使用してもうまくいきませんでした。
ご教授の程よろしくお願いいたします。
- 投稿日:2020-02-14T12:32:41+09:00
Unityで始めるゲーム制作1
はじめに
もっぱら技術ブログなどは、
自分が所属している同人サークル「RomanesqueFreaks」のブログで書いてたんですけど、
Unityの導入部分くらいはこっちにも書いちゃおうと思ったので、書きます。技術系やゲーム・IT系のイベントの話をしてるので、
是非ブログものぞいていってください!環境
Windows10
Mac(スクリーンショットはこちらの画面です)インストール
現在のオススメは複数バージョンのUnityを管理できるUnity Hubです。
こちらから「Unity Hubをダウンロード」を選択してダウンロードしてください。
exe/dmgを実行するとHubがインストールされます。
テキストエディタのインストール
Unityでの開発は主に、Unityのエディタを開きながらオブジェクトを配置したりして、それに対してC#を別のテキストエディタで書いていく、という流れになります。
(個人的にデュアルディスプレイがまじで使える場面です!)フリーで使えるエディタの中ではVisual Studioがとても強いのでインストールしてみましょう。
今回は個別にインストールしますが、もともと入っている場合はそれを使うことができるので、この手順はスキップしてください。
Visual Studioは統合開発環境、英語にした時の頭文字でIDE (Integrated Development Environment)と呼ばれる高機能なエディタです。
そのためPCのスペックが高くない時には、処理が重く大変になるかもしれません。
そんな時はVS Codeと呼ばれる Visual Studioの低機能軽量版での開発をお勧めします。
自分も一時期この環境で開発してました。
詳しくはこちらを。ではエディタのインストールの手順に入ります。
まず、Unity Hubを実行し、「インストール」をクリック。
インストール済みUnityのメニュー(グレーの3つの点)を選択。
「モジュールを加える」を選択
Windowsでは「 Microsoft Visual Studio Community 2017」、
Macでは 「Visual Studio for Mac」を選択し、「次へ」を押す。
すると規約が表示されるので、了承できる場合は「実行」を押すとインストールが開始されます。
- 投稿日:2020-02-14T12:32:41+09:00
Unityで始めるゲーム制作 導入編
はじめに
もっぱら技術ブログなどは、
自分が所属している同人サークル「RomanesqueFreaks」のブログで書いてたんですけど、
Unityの導入部分くらいはこっちにも書いちゃおうと思ったので、書きます。
導入といっても簡単なミニゲームを作るところまでやるつもりです!技術系やゲーム・IT系のイベントの話をしてるので、
是非ブログものぞいていってください!環境
Windows10
Mac(スクリーンショットはこちらの画面です)インストール
現在のオススメは複数バージョンのUnityを管理できるUnity Hubです。
こちらから「Unity Hubをダウンロード」を選択してダウンロードしてください。
exe/dmgを実行するとHubがインストールされます。
テキストエディタのインストール
Unityでの開発は主に、Unityのエディタを開きながらオブジェクトを配置したりして、それに対してC#を別のテキストエディタで書いていく、という流れになります。
(個人的にデュアルディスプレイがまじで使える場面です!)フリーで使えるエディタの中ではVisual Studioがとても強いのでインストールしてみましょう。
今回は個別にインストールしますが、もともと入っている場合はそれを使うことができるので、この手順はスキップしてください。
Visual Studioは統合開発環境、英語にした時の頭文字でIDE (Integrated Development Environment)と呼ばれる高機能なエディタです。
そのためPCのスペックが高くない時には、処理が重く大変になるかもしれません。
そんな時はVS Codeと呼ばれる Visual Studioの低機能軽量版での開発をお勧めします。
自分も一時期この環境で開発してました。
詳しくはこちらを。ではエディタのインストールの手順に入ります。
まず、Unity Hubを実行し、「インストール」をクリック。
インストール済みUnityのメニュー(グレーの3つの点)を選択。
「モジュールを加える」を選択
Windowsでは「 Microsoft Visual Studio Community 2017」、
Macでは 「Visual Studio for Mac」を選択し、「次へ」を押す。
すると規約が表示されるので、了承できる場合は「実行」を押すとインストールが開始されます。
続く
(2月下旬執筆予定・完了予定4月末)
- 投稿日:2020-02-14T11:00:09+09:00
Windows 10 & .NET Framework の環境で印刷するとメモリリークする
背景
Windows 7 の頃には問題なかった処理が Windows 10 に変更するとメモリリークするようになったので調べてみた。
再現コード
var server = new LocalPrintServer(); var queue = server.GetPrintQueue(this.SelectedPrinter.Value); var writer = PrintQueue.CreateXpsDocumentWriter(queue); if (!String.IsNullOrWhiteSpace(this.SelectedFilePath.Value)) { writer.Write(this.SelectedFilePath.Value); }解説
Windows 7 の頃はこれで問題なかったのだが、 Windows 10 では GetPrintQueue() で取得した PrintQueue がメモリリークすることがある。
具体的には、 XpsDocumentWriter.Write() を実行すると、 Windows 10 では COM Surrogate (dllhost.exe) に処理を委譲するようになっており、印刷が終わっても PrintQueue が破棄されるまでメモリが解放されないようだ。
プリンタドライバを古いものに替えると起きなくなったので、ドライバの不具合を疑いメーカーに問い合わせした所、 PrintTicket に対応したドライバを使用すると起きるらしい。
dllhost.exe は OS のモジュールなのでメーカー側ではどうしようもできないようだ。解決方法
印刷が終わったら PrintQueue を Dispose すればメモリが解放される。
var server = new LocalPrintServer(); using(var queue = server.GetPrintQueue(this.SelectedPrinter.Value)) { var writer = PrintQueue.CreateXpsDocumentWriter(queue); if (!String.IsNullOrWhiteSpace(this.SelectedFilePath.Value)) { writer.Write(this.SelectedFilePath.Value); } }感想
本来、これが行儀のいい書き方なので、困っている人はあまりいないかもしれないが、 Visual Studio で印刷すると同様のリークが起きたりするので、 Microsoft 内でも想定外なバグなのかもしれない。
サンプルのコードなんかを単純にコピペしてる人は困っているかもしれない。しかし、自分で new したものを Dispose するのは忘れないが、 GetPrintQueue() 内で新規にインスタンスが作成されていると思わないし、フレームワークが返したオブジェクトを勝手に Dispose してもいいのかとか色々考えてしまうので、あまり良い実装でないように思う。
因みにこのリークは .Net Core では起こりません。
サンプルコードはこちら
- 投稿日:2020-02-14T06:00:17+09:00
Unityでシューティングゲームを作る(5)
ここまでの進捗
- 背景がループするようにした。
- 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
- 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
- プレイヤーが画面の範囲外に行かないようにした。
- 敵とプレイヤーが衝突したらプレイヤーが消滅する。
- 分散攻撃の敵を実装する。
- タイトルシーンとエンディングシーンを追加する。
- プレイヤーがダメージ受けると点滅して数秒だけ無敵状態になる
今後やること
- ボスキャラの動作を実装する。
- エフェクトとBGMを追加する。
- プレイヤーが横に移動すると機体が傾くアニメーションをつける
この記事では赤い部分を作成した。
傾くアニメーション
これを実装する際にしたミスを含めて書きたいと思う
まずanimationを作成するには上のように
[window]→[Animation]→[Animation]を選択する
そうすると以下のようにAnimator controllerとAnimatorコンポーネントとAnimation Clipが作成される
最初に試した方法
Animation Clipの中で設置するひし形のものをキーという。
Animation Clipを編集するが、傾きをrotateで表せばいいと思っていた。
0.10,0.20,0.30の位置にY軸にそれぞれ30,40,50で回転させたキーを置いた。これの問題点
実行してみるとボタンを押したときに回転するが、なぜか少ししたらプレイヤーの機体が消えてしまう。
原因を調べてみたらどうやらZ座標がマイナス方向に増えていってしまい、カメラよりも後ろにプレイヤーの機体が行ってしまっていることが分かった。
おそらく30や40に傾けた上でtranslateで移動しているのでz軸方向にも移動してしまったと思われる。次に試した方法
gameの中でプレイヤーの機体をY軸で傾けたものをスクリーンショットで撮り、それをUnity内でSprite Editorを用いることで余計な部分から切り抜いた。
Sprite EditorのCustom Outlineで以下のように点をとって切り抜いていくこれを右に傾けた時と左に傾けた時で作成してAnimation Clipに以下のようにそれぞれ配置する。
このクリップをAnimator Controllerで遷移させる。作成したクリップをAnimator Controller上にドラック&ドロップする。
このとき遷移させる条件を指定しないといけないので左上のParametersから[+のマーク]→[Bool]を選択する。これでスクリプトの中でParametersのパラメータをtrue or falseにすることで遷移させることができる。
Has Exit Timeのチェックを外してTransition Durationを0にする
Conditionsの+マークをおして遷移条件を作成する。後はスクリプトでタップしたらAnimationが動作するようにする
//タッチ判定 if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); if (touch.position.x < Screen.width * 0.5f) { //画面外に行かないようにする if (-3.1 < transform.position.x) { transform.Translate(-0.05f, 0, 0); if (touch.phase == TouchPhase.Began) { //押した時 anim.SetBool("left_long", true); } if (touch.phase == TouchPhase.Moved) { //長押しの時 anim.SetBool("left_long", true); } if (touch.phase == TouchPhase.Ended) { //指を離した時 anim.SetBool("left_long",false); } } else { transform.Translate(0, 0, 0); anim.SetBool("left_long", true); } } else if (touch.position.x > Screen.width * 0.5f) { //画面外に行かないようにする if (3.1 > transform.position.x) { transform.Translate(0.05f, 0, 0); if (touch.phase == TouchPhase.Began) { //押した時 anim.SetBool("right_long", true); } if (touch.phase == TouchPhase.Moved) { //長押しの時 anim.SetBool("right_long", true); } if (touch.phase == TouchPhase.Ended) { //指を離した時 anim.SetBool("right_long",false); } } else { transform.Translate(0, 0, 0); anim.SetBool("right_long", true); } } }例えばanim.SetBool("left_long", true)でParameter"left_long"をtrueにするので左に傾くアニメーションを流す。
スクリプトの内容を説明するとInput.touchCount > 0 でタッチされているかチェックする。
Touch touch = Input.GetTouch(0)は長押しなどのタッチされた時の状態を取得している。
条件の中にあるtouch.phase==TouchPhase.Beganは「タッチしたとき」、touch.phase == TouchPhase.Movedは「長押ししてるとき」、touch.phase == TouchPhase.Endedは「指を話したとき」の判定をしている。これでできたのが以下になる。
これ簡単にみえるけどつまづいたところを調べたりしてかなり時間かかってしまった。
これであとはボスを作るだけになった。
- 投稿日:2020-02-14T06:00:17+09:00
Unityでシューティングゲームonomatihar
ここまでの進捗
- 背景がループするようにした。
- 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
- 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
- プレイヤーが画面の範囲外に行かないようにした。
- 敵とプレイヤーが衝突したらプレイヤーが消滅する。
- 分散攻撃の敵を実装する。
- タイトルシーンとエンディングシーンを追加する。
- プレイヤーがダメージ受けると点滅して数秒だけ無敵状態になる
今後やること
- ボスキャラの動作を実装する。
- エフェクトとBGMを追加する。
- プレイヤーが横に移動すると機体が傾くアニメーションをつける
この記事では赤い部分を作成した。
傾くアニメーション
これを実装する際にしたミスを含めて書きたいと思う
まずanimationを作成するには上のように
[window]→[Animation]→[Animation]を選択する
そうすると以下のようにAnimator controllerとAnimatorコンポーネントとAnimation Clipが作成される
最初に試した方法
Animation Clipの中で設置するひし形のものをキーという。
Animation Clipを編集するが、傾きをrotateで表せばいいと思っていた。
0.10,0.20,0.30の位置にY軸にそれぞれ30,40,50で回転させたキーを置いた。これの問題点
実行してみるとボタンを押したときに回転するが、なぜか少ししたらプレイヤーの機体が消えてしまう。
原因を調べてみたらどうやらZ座標がマイナス方向に増えていってしまい、カメラよりも後ろにプレイヤーの機体が行ってしまっていることが分かった。
おそらく30や40に傾けた上でtranslateで移動しているのでz軸方向にも移動してしまったと思われる。次に試した方法
gameの中でプレイヤーの機体をY軸で傾けたものをスクリーンショットで撮り、それをUnity内でSprite Editorを用いることで余計な部分から切り抜いた。
Sprite EditorのCustom Outlineで以下のように点をとって切り抜いていくこれを右に傾けた時と左に傾けた時で作成してAnimation Clipに以下のようにそれぞれ配置する。
このクリップをAnimator Controllerで遷移させる。作成したクリップをAnimator Controller上にドラック&ドロップする。
このとき遷移させる条件を指定しないといけないので左上のParametersから[+のマーク]→[Bool]を選択する。これでスクリプトの中でParametersのパラメータをtrue or falseにすることで遷移させることができる。
Has Exit Timeのチェックを外してTransition Durationを0にする
Conditionsの+マークをおして遷移条件を作成する。後はスクリプトでタップしたらAnimationが動作するようにする
//タッチ判定 if (Input.touchCount > 0) { Touch touch = Input.GetTouch(0); if (touch.position.x < Screen.width * 0.5f) { //画面外に行かないようにする if (-3.1 < transform.position.x) { transform.Translate(-0.05f, 0, 0); if (touch.phase == TouchPhase.Began) { //押した時 anim.SetBool("left_long", true); } if (touch.phase == TouchPhase.Moved) { //長押しの時 anim.SetBool("left_long", true); } if (touch.phase == TouchPhase.Ended) { //指を離した時 anim.SetBool("left_long",false); } } else { transform.Translate(0, 0, 0); anim.SetBool("left_long", true); } } else if (touch.position.x > Screen.width * 0.5f) { //画面外に行かないようにする if (3.1 > transform.position.x) { transform.Translate(0.05f, 0, 0); if (touch.phase == TouchPhase.Began) { //押した時 anim.SetBool("right_long", true); } if (touch.phase == TouchPhase.Moved) { //長押しの時 anim.SetBool("right_long", true); } if (touch.phase == TouchPhase.Ended) { //指を離した時 anim.SetBool("right_long",false); } } else { transform.Translate(0, 0, 0); anim.SetBool("right_long", true); } } }例えばanim.SetBool("left_long", true)でParameter"left_long"をtrueにするので左に傾くアニメーションを流す。
スクリプトの内容を説明するとInput.touchCount > 0 でタッチされているかチェックする。
Touch touch = Input.GetTouch(0)は長押しなどのタッチされた時の状態を取得している。
条件の中にあるtouch.phase==TouchPhase.Beganは「タッチしたとき」、touch.phase == TouchPhase.Movedは「長押ししてるとき」、touch.phase == TouchPhase.Endedは「指を話したとき」の判定をしている。これでできたのが以下になる。
これ簡単にみえるけどつまづいたところを調べたりしてかなり時間かかってしまった。
これであとはボスを作るだけになった。