カテゴリー: IDE・ツール・ライブラリ関連

うにのトゲは刺さると痛い(´・ω・`)-4

画像の動的読み込み

このスクリプトをAddComponentしているGameObjectのSpriteRendererの画像を動的に「Assets\Resources\images\card_ura.png」に変更するには

this.gameObject.GetComponent<SpriteRenderer>().sprite = Resources.Load<Sprite>("images/card_ura");

と書くらしい。指定すべきフォルダパスは「Assets\Resources\」からの相対パスで良いらしい。

Resources.Load


エディタでは動くのに実機では動かないヽ(`Д´)ノ

トランプの神経衰弱ゲームを作るだけなら必要はないのであるが、後々のことを考えてsqliteを使うようにしてみた。

参考:
UnityでSQLiteを扱う方法
UnityにSQLiteを導入する

取り敢えずは動いていたので、それ以外の調査等々をし、GameObject上に直接テキストを描画するのは難しそうだと分かりがっかりする(´・ω・`)

でまぁ、しばらく、というほどでもないが半日くらい実機で確認してなかったので、久しぶりに実機で実行させてみた…

 

 

 

なんかおかしい…( ;・´ω・`)ゴクリッ

エラーとかは出てないのだけれども、カードのプレハブがインスタンス化されていない…

色々と調べた結果、 SqliteDatabaseクラスのExecuteQuery()を投げる前までは動いていて、この行以降の処理がされていない(´・ω・`)

なんやかんやぐぐったり数時間かけて判明した…_| ̄|○
なんかプラットフォームでの切り替え設定をしないといけないみたい。少なからずうちの環境ではそうだった…

うちはx86_64用のsqlite3.dllとAndroid用のlibsqlite3.soだけ入れて、前者をEditorとStandaloneにして後者をAndroidだけにした。
参考:
Windows64bit&Unity5(64bit)でSQLite。

他のページ等ではこの説明がないんだよなぁ…もしかして皆エディタ上で動いて「わーいヽ( ・∀・)ノ」ってなってAndroidの実機で試してないとか( ・´ω・`)? あるいはうちの環境が特殊なのか、俺氏が何か手順をし忘れているとか…?

まあなんにせよ解決して良かった(ヽ'ω`)


もう一週間以上も時間かけてるのに、ここまでしか進んでいない(´・ω・`)
単純な神経衰弱を作るならもっと簡単に適当に出来るんだろうけれども、寄り道が多すぎる(ノ∀`)

しかしテキストやら任意の画像の描画が簡単に出来ないのはきついなぁ(´・ω・`)ドウシヨウカナ

うにのトゲは刺さると痛い(´・ω・`)-3

Web上にあるUnityのサンプルコードを眺めているとC#固有というか特有な機能等があったりして、C#をよく解っていない俺氏はコードが理解出来ず(´・ω・`)

その都度ぐぐるわけだが、それも段々面倒くさくなり、C#の本でも買うかと考えた。
で、たまたまkindleでセールをやっていて、金城俊哉という人の「Visual C# 2017パーフェクトマスター」という書籍が¥1,244だったので買ってみた。amazonのレビューでも悪くなさそうだったのだが…

 

 

失敗だった…_| ̄|○

日本語表現がちょっとおかしかったり、同じ表現を繰り返してまだるっこしかったり、踏み込んだ内容が少なくて冗長、誤字等が多いという感じで読んでいて苦痛だったわ(ヽ'ω`)
レイアウトや時々入ってるHintやMemoとかもなんか酷かったな。あれは空白を埋める為に適当に入れるものなんだろうか。

4章までは頑張って読んだけどそこで本を閉じた…_| ̄|○
後のアプリケーション作成の方は必要になったら読めばいいし。マルチスレッドプログラミングも今のところ必要ないし。

この人は同じような本を何冊か書いてるみたいなんだけど、皆こんなレベルなんだろうか。
もしかしたら下請けライターみたいなのが居て、それを取りまとめているのかなぁ?
一部分だけ詳述されているがそれ以外の部分は知っていることをただ羅列しましたみたいな感じで内容にムラがあったので、そんな風に思ってしまった。

取り敢えず中級者が読むには内容が薄く、初級者が読むには誤字が多くて表現が冗長で解りにくいという印象。もっと言うと知識を文字(及び図)を使って他者へと伝達するという意志が見られない書籍であった(ノ∀`)

これを買うならWebでぐぐって自分に合った学習サイトで勉強した方がいいかもねぇ(´・ω・`)
この人の本と秀和システムの本にはもう手を出さないにしようw
内容は著者が担う問題だけど誤字が酷いのは編集プロダクションか出版社の問題だからなぁw


画面スクロール

結局スクロールに関しては「UnityでiOS/Android/Editorの共通タッチ処理を実装する」にdeltaを取れるように追加してみたをベースにし、2本指でスワイプした時にカメラを並行移動させる処理を実装するの内容を混ぜてみた。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ScreenScroll : MonoBehaviour {

<pre><code>public float moveSpeed = 0.1f;
private Camera mainCamera;
private float horizontalPosition;
private float varticalPosition;
private Vector2 beforePoint;
private Vector2 nowPoint;

// Use this for initialization
void Start()
{
    mainCamera = Camera.main;
}

// Update is called once per frame
void Update()
{
    TouchInfo info = AppUtil.GetTouch();
    switch (info)
    {
        case TouchInfo.Began:
            beforePoint = AppUtil.GetTouchPosition();
            break;

        case TouchInfo.Moved:
            nowPoint = AppUtil.GetTouchPosition();

            if (nowPoint.x - beforePoint.x != 0)
            {
                horizontalPosition = (nowPoint.x - beforePoint.x) * (-1);
                horizontalPosition *= moveSpeed * Time.deltaTime;

                mainCamera.transform.position =
                    new Vector3(Mathf.Clamp(mainCamera.transform.position.x + horizontalPosition, 0f, 7f),
                mainCamera.transform.position.y, 0f);

            }

            if (nowPoint.y - beforePoint.y != 0)
            {
                varticalPosition = (nowPoint.y - beforePoint.y) * (-1);
                varticalPosition *= moveSpeed * Time.deltaTime;

                mainCamera.transform.position =
                    new Vector3(mainCamera.transform.position.x,
                Mathf.Clamp(mainCamera.transform.position.y + varticalPosition, -10f, 0f), 0f);
            }

            beforePoint = nowPoint;
            break;
        case TouchInfo.Ended:
            break;
    }
}
</code></pre>

}

この内容が正しいかどうかは解らない(ノ∀`)
2D用スクロールなのでQuaternionの辺りは削除してみた。
一応動いてくれてるので、後は移動限界値を可変にするだけでいいかな。


imageと普通のオブジェクトの違い(ヽ'ω`)
面倒くさくなって来たので端折って書くが、Unityの寺子屋 定番スマホゲーム開発入門で学んだことから拡張しておこうとした俺氏は、

  1. UI上にimageを並べてしまったが為に画面スクロールがまともに動作しないという事態に陥る。(カメラ設定を変えると動くけど意図しない大きさになったんだったかな?)
  2. imageからGameObjectに変え、canvasではなく新たに作ったGameObjectの子としてインスタンスを生成したら、スクロールはするようになったが、意図した配置にならなくなった。
  3. インポートしたimageの「Pixels Per Unit」を正しい値にしたら、まぁまぁ意図した配置になった。(厳密には未解決(ノ∀`))
  4. GameObjectをタップしても反応しなかったので、Physics 2D RaycasterやらBox Collider 2Dを追加したり。

参考:
【Unity2D】Pixels per Uint について
Unity(3D・2D) EventSystemでクリックイベントの制御

画面出力
実機の画面上に簡単に出力する方法が見当たらなかったので、
UnityのGUIでテキスト(文字)を表示させる方法【初心者向け】
テキストのサイズを変更する
を参考に、

    void Start()
    {
        style = new GUIStyle();
        style.fontSize = 50;
    }

<pre><code>void OnGUI()
{
    GUI.TextField(new Rect(100, 100, 200, 200), Screen.width + &amp;quot;:&amp;quot; + Screen.height,style);
}
</code></pre>

みたいな感じにした。まあこれは解像度を出力してるだけ。
「Screen.width + ":" + Screen.height」の部分を変数にしといて、update()の方でその値を更新すれば画面ログ出力が出来る感じか(´・ω・`)

うにのトゲは刺さると痛い(´・ω・`)-2

まだまだだらだらとスワイプで悩む(´・ω・`)

2本指スワイプでカメラを並行移動する処理を実装する(スマホ向け)のエントリで紹介されているコードを試す。今自分が欲しいのは、このパターンの拡張したものかなぁと思い始める。

そう言えば、

        if (Input.touchCount &gt;= 2)
        {
            subscript = 1;
        }
        else
        {
            subscript = 0;
        }

<pre><code>    if(Input.touchCount &amp;gt;= 1)
    {
        Debug.Log(&amp;quot;touchCount: &amp;quot; + Input.touchCount);

        if (Input.GetTouch(subscript).phase == TouchPhase.Began)
        {
            beforePoint[0] = Input.GetTouch(0).position;
            beforePoint[1] = Input.GetTouch(subscript).position;
        }

みたいな感じにしておかないとInput.GetTouch(1)でエラーになった。
コードの書き方が変なのは気にしない(・3・) C# newbie
つーか自分で使うのは2本指でのスワイプは必要ないから、二点目の格納部分をごっそり削ってもいいのかもしれない。

これをMathf.Clampで制限して、あと移動速度を変えようか…

でもこれだとEditorでテスト出来ないから、
UnityでiOS/Android/Editorの共通タッチ処理を実装するかその改変版の「UnityでiOS/Android/Editorの共通タッチ処理を実装する」にdeltaを取れるように追加してみたで紹介されているようなコードにしてみるべきか。前者の方はAssetになっている模様だけど、触ってない(ノ∀`)

他にも、【Unity】【C#】スワイプ(フリック)を判定、方向を取得してコールバックする というエントリで紹介されているコードを試してみた。これも無事に動くことを確認した。(まぁ以下のように適当に書いたscriptファイルを追加して、その中のOnSwipeメソッド内で引数をDebug.Logさせただけだけどw)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class testOnswipe : MonoBehaviour {
    public void Onswipe(Vector2 swipeDir) {

<pre><code>    if(swipeDir == Vector2.up)
    {
        Debug.Log(&amp;quot;swipeDir: up&amp;quot; + swipeDir);
    }

    if (swipeDir == Vector2.right)
    {
        Debug.Log(&amp;quot;swipeDir: right&amp;quot; + swipeDir);
    }

    if (swipeDir == Vector2.left)
    {
        Debug.Log(&amp;quot;swipeDir: left&amp;quot; + swipeDir);
    }

    if (swipeDir == Vector2.down)
    {
        Debug.Log(&amp;quot;swipeDir: down&amp;quot; + swipeDir);
    }
}
</code></pre>

}

このコードはUnityEventとかc#のdelegateとか色々と新しい概念が絡んで来て、理解するのに苦労した(ヽ'ω`) このエントリ内でもリンクされていた、【Unity】【C#】UnityEvent, Action, delegate, interface でのコールバック実装方法とインスペクタでの登録 やら他のサイトを眺めたりして何となく納得する(´・ω・`)リカイハシテナイ


これはこれで勉強にはなったが、やはり最初の方の路線で行こうかな。つーか別に今一番大事なところではなかったな、スワイプスクロール(ノ∀`)w

うにのトゲは刺さると痛い(´・ω・`)

なんかビルドができなくなった(´・ω・`)

またどうでも良いことではまった(ヽ'ω`)

カメラの移動をスワイプ等々で行うサンプルコードを試していた時に、実機で挙動を確かめようとしたら、以下のようなエラーを吐いてビルドに失敗した(´・ω・`)

CommandInvokationFailure: Unable to list target platforms. Please make sure the android sdk path is correct.
C:/android_sdk\tools\bin\avdmanager.bat list target -c
--------------------------------------------
CommandInvokationFailure: Unable to list target platforms. Please make sure the android sdk path is correct.
C:/android_sdk\tools\bin\avdmanager.bat list target -c
--------------------------------------------
Build completed with a result of 'Failed'
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
--------------------------------------------
UnityEditor.BuildPlayerWindow+BuildMethodException: 2 errors
at UnityEditor.BuildPlayerWindow+DefaultBuildMethods.BuildPlayer (BuildPlayerOptions options) [0x0020e] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:181
at UnityEditor.BuildPlayerWindow.CallBuildMethods (Boolean askForBuildLocation, BuildOptions defaultBuildOptions) [0x00065] in C:\buildslave\unity\build\Editor\Mono\BuildPlayerWindowBuildMethods.cs:88
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)

色々調べた結果、よく解らないがUnityとAndroid SDKツールのバージョンの整合性が取れてないとかそういうことみたい。UnityのSDKの参照先を"C:\Program Files (x86)\Android\android-sdk\build-tools"にしたら通るようになった。ここには"25.0.3"だけが入っていた。いつ入れたものだろう? Android Studioを入れた時に自動的にインストールされたんだろうか? まあ何はともあれ、25辺りのSDKのセットをダウンロードしてきて指定すればええんかのぅ(・∀・)?


俺氏、全くもってUnityのしきたりに馴染めず(´・ω・`)

神経衰弱だから、一画面でスクロールしなくてもいいかなぁと思っていたけれども、その拡張やらカードサイズを大きくした時の為にスクロールのやり方を勉強しとこうと思い、また色々はまる(ヽ'ω`)

[Unity] Rigidbodyを使わずにオブジェクトをフリックするというこちらのページをベースに、

092 カメラの移動範囲を制限する
【Unity勇者の奮闘記】Mathf.Clampを使いこなす
【Unity】オブジェクトの移動範囲を制限するMathf.Clampの使い方
といったページの内容を参考に

ドラッグ移動のところと慣性移動のところのtransform.position代入行の次行にそれぞれ

transform.position = new Vector3(Mathf.Clamp(transform.position.x, 0f,7f),
                Mathf.Clamp(transform.position.y,-10f,0f), 

というのをぶちこんだら、なんちゃってスクロールは出来るようになった(´・ω・`)

ただちょっと、移動速度や制限値に達した後の動きが気になるのでそこら辺は修正しないと駄目かな。(まだVector3とかVelocityとかよく判ってない(´・ω・`))

まあ、神経衰弱とかならこんな感じでもいいのかな。
だんだん、物理演算とか必要のないトランプゲームでちょっと凝ったことをやるなら、Unityを使わずに自分でJavaで書いた方がいいんじゃないかと思わなくもないけど、Android Studioの使い方を覚えるのがめんどくさいのでこのまま行くしかないか…( ;・´ω・`)ゴクリッ