20200214のC#に関する記事は7件です。

Unity で暗号化した SQLite (SQLCipher) を使うやり方のまとめ

暗号化はいらないときの基本

SQLite をシンプルに使うやりかたは、前の記事に書いたとおりです。

暗号化が必要になったとき

実際にアプリを公開するときに、DB ファイルの中身があっさり書き換えることができるのは、ちょっと……って思うなら暗号化がベスト。でも、これは自分で SQLite3 のライブラリーをコンパイルする道を選択したのと同じことだと思います。

GitHub - SQLiteUnityKit を利用しつつ Unity で SQLite を使うとき、暗号化するなら JAVA なんかがライブラリーの中に入ってくると邪魔になります。このキットはシンプルに DllImport で関数を呼び出してるだけです。

なので、なるべくシンプルに dll と so ファイルを作る必要があると思います。(x86/x64 win/android の4パターン)

このあたりを記事にまとめたので、ショートカットをメモ。

ビギナーなので、間違いがあったらすいません。(おしえてください)このあたりの記事は 2020/02 時点では、数が少ないので、もうすこしネタが増えると嬉しく思います。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

c# フォームのサイズ変更について。

C#でプログラミングをしております。

フォームを拡大、縮小した際に、
フォームに配置されている
3つの同じ大きさのボタンも、
フォームに追従するように拡大、縮小させるにはどのようにプログラミングすれば実現可能でしょうか。

AnchorプロパティやDockプロパティを使用してもうまくいきませんでした。

ご教授の程よろしくお願いいたします。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで始めるゲーム制作1

はじめに

もっぱら技術ブログなどは、
自分が所属している同人サークル「RomanesqueFreaks」のブログで書いてたんですけど、
Unityの導入部分くらいはこっちにも書いちゃおうと思ったので、書きます。

技術系やゲーム・IT系のイベントの話をしてるので、
是非ブログものぞいていってください!

環境

Windows10
Mac(スクリーンショットはこちらの画面です)

インストール

現在のオススメは複数バージョンのUnityを管理できるUnity Hubです。
こちらから「Unity Hubをダウンロード」を選択してダウンロードしてください。
exe/dmgを実行するとHubがインストールされます。
Screen_Shot_2020-02-14_at_12_12_53.png

テキストエディタのインストール

Unityでの開発は主に、Unityのエディタを開きながらオブジェクトを配置したりして、それに対してC#を別のテキストエディタで書いていく、という流れになります。
(個人的にデュアルディスプレイがまじで使える場面です!)

フリーで使えるエディタの中ではVisual Studioがとても強いのでインストールしてみましょう。

今回は個別にインストールしますが、もともと入っている場合はそれを使うことができるので、この手順はスキップしてください。

Visual Studioは統合開発環境、英語にした時の頭文字でIDE (Integrated Development Environment)と呼ばれる高機能なエディタです。
そのためPCのスペックが高くない時には、処理が重く大変になるかもしれません。
そんな時はVS Codeと呼ばれる Visual Studioの低機能軽量版での開発をお勧めします。
自分も一時期この環境で開発してました。
詳しくはこちらを。

ではエディタのインストールの手順に入ります。

まず、Unity Hubを実行し、「インストール」をクリック。
Screen_Shot_2020-02-14_at_12_21_08.png
インストール済みUnityのメニュー(グレーの3つの点)を選択。
Screen_Shot_2020-02-14_at_12_21_29.png
「モジュールを加える」を選択
Screen_Shot_2020-02-14_at_12_21_40.png
Windowsでは「 Microsoft Visual Studio Community 2017」、
Macでは 「Visual Studio for Mac」を選択し、「次へ」を押す。
Screen_Shot_2020-02-14_at_12_21_58.png
Screen_Shot_2020-02-14_at_12_25_42.png

すると規約が表示されるので、了承できる場合は「実行」を押すとインストールが開始されます。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityで始めるゲーム制作 導入編

はじめに

もっぱら技術ブログなどは、
自分が所属している同人サークル「RomanesqueFreaks」のブログで書いてたんですけど、
Unityの導入部分くらいはこっちにも書いちゃおうと思ったので、書きます。
導入といっても簡単なミニゲームを作るところまでやるつもりです!

技術系やゲーム・IT系のイベントの話をしてるので、
是非ブログものぞいていってください!

環境

Windows10
Mac(スクリーンショットはこちらの画面です)

インストール

現在のオススメは複数バージョンのUnityを管理できるUnity Hubです。
こちらから「Unity Hubをダウンロード」を選択してダウンロードしてください。
exe/dmgを実行するとHubがインストールされます。
Screen_Shot_2020-02-14_at_12_12_53.png

テキストエディタのインストール

Unityでの開発は主に、Unityのエディタを開きながらオブジェクトを配置したりして、それに対してC#を別のテキストエディタで書いていく、という流れになります。
(個人的にデュアルディスプレイがまじで使える場面です!)

フリーで使えるエディタの中ではVisual Studioがとても強いのでインストールしてみましょう。

今回は個別にインストールしますが、もともと入っている場合はそれを使うことができるので、この手順はスキップしてください。

Visual Studioは統合開発環境、英語にした時の頭文字でIDE (Integrated Development Environment)と呼ばれる高機能なエディタです。
そのためPCのスペックが高くない時には、処理が重く大変になるかもしれません。
そんな時はVS Codeと呼ばれる Visual Studioの低機能軽量版での開発をお勧めします。
自分も一時期この環境で開発してました。
詳しくはこちらを。

ではエディタのインストールの手順に入ります。

まず、Unity Hubを実行し、「インストール」をクリック。
Screen_Shot_2020-02-14_at_12_21_08.png
インストール済みUnityのメニュー(グレーの3つの点)を選択。
Screen_Shot_2020-02-14_at_12_21_29.png
「モジュールを加える」を選択
Screen_Shot_2020-02-14_at_12_21_40.png
Windowsでは「 Microsoft Visual Studio Community 2017」、
Macでは 「Visual Studio for Mac」を選択し、「次へ」を押す。
Screen_Shot_2020-02-14_at_12_21_58.png
Screen_Shot_2020-02-14_at_12_25_42.png

すると規約が表示されるので、了承できる場合は「実行」を押すとインストールが開始されます。

続く
(2月下旬執筆予定・完了予定4月末)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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 では起こりません。

サンプルコードはこちら

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityでシューティングゲームを作る(5)

ここまでの進捗

  • 背景がループするようにした。
  • 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
  • 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
  • プレイヤーが画面の範囲外に行かないようにした。
  • 敵とプレイヤーが衝突したらプレイヤーが消滅する。
  • 分散攻撃の敵を実装する。
  • タイトルシーンとエンディングシーンを追加する。
  • プレイヤーがダメージ受けると点滅して数秒だけ無敵状態になる

今後やること

  • ボスキャラの動作を実装する。
  • エフェクトとBGMを追加する。
  • プレイヤーが横に移動すると機体が傾くアニメーションをつける

この記事では赤い部分を作成した。

傾くアニメーション

これを実装する際にしたミスを含めて書きたいと思う
まずanimationを作成するには上のように
[window]→[Animation]→[Animation]を選択する
コメント 2020-02-14 034311.png

そうすると以下のようにAnimator controllerとAnimatorコンポーネントとAnimation Clipが作成される

コメント 2020-02-14 034048.png

最初に試した方法

Animation Clipの中で設置するひし形のものをキーという。
Animation Clipを編集するが、傾きをrotateで表せばいいと思っていた。
0.10,0.20,0.30の位置にY軸にそれぞれ30,40,50で回転させたキーを置いた。

コメント 2020-02-14 035615.png

これの問題点

実行してみるとボタンを押したときに回転するが、なぜか少ししたらプレイヤーの機体が消えてしまう。
原因を調べてみたらどうやらZ座標がマイナス方向に増えていってしまい、カメラよりも後ろにプレイヤーの機体が行ってしまっていることが分かった。
おそらく30や40に傾けた上でtranslateで移動しているのでz軸方向にも移動してしまったと思われる。

次に試した方法

gameの中でプレイヤーの機体をY軸で傾けたものをスクリーンショットで撮り、それをUnity内でSprite Editorを用いることで余計な部分から切り抜いた。
Sprite EditorのCustom Outlineで以下のように点をとって切り抜いていく

コメント 2020-02-14 042522.png

これを右に傾けた時と左に傾けた時で作成してAnimation Clipに以下のようにそれぞれ配置する。

コメント 2020-02-14 042947.png

このクリップをAnimator Controllerで遷移させる。作成したクリップをAnimator Controller上にドラック&ドロップする。
このとき遷移させる条件を指定しないといけないので左上のParametersから[+のマーク]→[Bool]を選択する。

コメント 2020-02-14 044223.png

これでスクリプトの中でParametersのパラメータをtrue or falseにすることで遷移させることができる。

コメント 2020-02-14 045807.png

Has Exit Timeのチェックを外してTransition Durationを0にする
Conditionsの+マークをおして遷移条件を作成する。

コメント 2020-02-14 044223 (2)_LI.jpg

後はスクリプトでタップしたら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は「指を話したとき」の判定をしている。

これでできたのが以下になる。

ezgif.com-video-to-gif (5).gif

これ簡単にみえるけどつまづいたところを調べたりしてかなり時間かかってしまった。

これであとはボスを作るだけになった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityでシューティングゲームonomatihar

ここまでの進捗

  • 背景がループするようにした。
  • 普通の敵の動作を作成し、その敵が3秒ごとに生成される。
  • 瞬間移動する敵の動作を作成し、5秒ごとに生成する。
  • プレイヤーが画面の範囲外に行かないようにした。
  • 敵とプレイヤーが衝突したらプレイヤーが消滅する。
  • 分散攻撃の敵を実装する。
  • タイトルシーンとエンディングシーンを追加する。
  • プレイヤーがダメージ受けると点滅して数秒だけ無敵状態になる

今後やること

  • ボスキャラの動作を実装する。
  • エフェクトとBGMを追加する。
  • プレイヤーが横に移動すると機体が傾くアニメーションをつける

この記事では赤い部分を作成した。

傾くアニメーション

これを実装する際にしたミスを含めて書きたいと思う
まずanimationを作成するには上のように
[window]→[Animation]→[Animation]を選択する
コメント 2020-02-14 034311.png

そうすると以下のようにAnimator controllerとAnimatorコンポーネントとAnimation Clipが作成される

コメント 2020-02-14 034048.png

最初に試した方法

Animation Clipの中で設置するひし形のものをキーという。
Animation Clipを編集するが、傾きをrotateで表せばいいと思っていた。
0.10,0.20,0.30の位置にY軸にそれぞれ30,40,50で回転させたキーを置いた。

コメント 2020-02-14 035615.png

これの問題点

実行してみるとボタンを押したときに回転するが、なぜか少ししたらプレイヤーの機体が消えてしまう。
原因を調べてみたらどうやらZ座標がマイナス方向に増えていってしまい、カメラよりも後ろにプレイヤーの機体が行ってしまっていることが分かった。
おそらく30や40に傾けた上でtranslateで移動しているのでz軸方向にも移動してしまったと思われる。

次に試した方法

gameの中でプレイヤーの機体をY軸で傾けたものをスクリーンショットで撮り、それをUnity内でSprite Editorを用いることで余計な部分から切り抜いた。
Sprite EditorのCustom Outlineで以下のように点をとって切り抜いていく

コメント 2020-02-14 042522.png

これを右に傾けた時と左に傾けた時で作成してAnimation Clipに以下のようにそれぞれ配置する。

コメント 2020-02-14 042947.png

このクリップをAnimator Controllerで遷移させる。作成したクリップをAnimator Controller上にドラック&ドロップする。
このとき遷移させる条件を指定しないといけないので左上のParametersから[+のマーク]→[Bool]を選択する。

コメント 2020-02-14 044223.png

これでスクリプトの中でParametersのパラメータをtrue or falseにすることで遷移させることができる。

コメント 2020-02-14 045807.png

Has Exit Timeのチェックを外してTransition Durationを0にする
Conditionsの+マークをおして遷移条件を作成する。

コメント 2020-02-14 044223 (2)_LI.jpg

後はスクリプトでタップしたら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は「指を話したとき」の判定をしている。

これでできたのが以下になる。

ezgif.com-video-to-gif (5).gif

これ簡単にみえるけどつまづいたところを調べたりしてかなり時間かかってしまった。

これであとはボスを作るだけになった。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む