カテゴリー: Unity

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

だらだらしていたら、もう一週間くらい経っていた(´・ω・`)

ようやくGitを使い始める

Unity を Git でバージョン管理する等を参考にGitでバージョン管理をするようにした。というほどのことでもないが。SourceTreeってAtlassianが作ってるGitクライアントなのか。
でもローカルリポジトリだけなので、そのうちVPSサーバの方にクローンしないといけない。
その前にサーバの維持費用捻出出来るかしら(´・ω・`)


あとは特に調べたというほどのこともなく、適当実装しただけ(´・ω・`)

取り敢えず、無料素材のトランプ画像を組み込む(´・ω・`)ワンクリックボキンシタデ

今ひとつUnityでのプログラミング方法が分からず悩む(´・ω・`)
結局、各カードオブジェクトにくっつけているCardManager.cs内に選択されたカード(一枚目、二枚目)への参照を保持するクラス変数を作って、update内でチェックする形にした。二つとも格納されたら、表示時間を設定して、毎update()毎にTime.deltaTimeで減算していって、0以下になったらジャッジして、マッチならオブジェクトをDestroyし、マッチ/アンマッチ関わらず表示部をクリアするようにした。

 

マッチした時は、何らかのアニメーションを入れるべきか否か。
でもそこら辺は苦手なのでパーティクル?とかでごまかそうかな。
ようやく神経衰弱の骨格部分は出来たので、もう少しゲームっぽい装飾をしよう。
そうしたら、本当に作りたかった部分を実装するかな。
まあしかし、トランプを使ってるからとは言え、カードセットは54枚じゃなくてもいいかなぁ。
後々のことを考えて24,36,48のセットを選択出来るようにすればいいか。

うにのトゲは刺さると痛い(´・ω・`)-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