カテゴリー: Unity

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

色々とハマっていたら、何を変更したか思い出せなくなって来た(“・ω・゙)

結局、画面スクロールはやめた(ノ∀`)

取り敢えず今までのやり方で一応神経衰弱ゲームとしての機能は実装出来たのだけれども、実際に自分で何回か実機で試遊して思ったが、

 

 

 

神経衰弱と画面スクロールって、相性悪い_| ̄|○

スクロールするとそれが何行目で何列目かが判らなくなる(ノ∀`)
まあガイドみたいなのを表示すればいいんだろうけれども、そこまでするのもなんだなと。

ということで、World空間じゃなくてUI上にUI Image(GameObjectでもいいけども)を配置してスクロールしない一画面タイプにすることにした。この場合、解像度の違いによってカード間処理等を考慮しなくて済むような気がするし。

まあ画面スクロールは今後何かで必要になるかもしれないから、調査にかけた時間は無駄ではなかったと思いたい…(ヽ’ω`)


カードめくりはiTweenで

カード消失の前にカードめくりアニメーションを以下のページを参考に実装した。
【Unity Asset】iTweenがすごく便利だった
【Unity】iTweenの使い方 / お試し【入門】

上のエントリはiTween.RotateToの0.2の後のカンマがあることとcomplete()のgameobjectがgameObjectであることでエラーになった(´・ω・`)

実際のコード 裏側図柄のカードがタッチされた時に

                iTween.RotateTo(this.gameObject, iTween.Hash(
                    "y", 90, "time", 0.2f,
                    "oncompletetarget", this.gameObject,
                    "oncomplete", "CardOpenedAnim",
                    "delay", 0.01f
                ));

という感じでアニメを開始し、

上記のアニメが終わったら、つまり裏側画像を持ったImageが90度になったら、表側画像をImageにセットし、0度へと戻すようにした。

    void CardOpenedAnim()
    {
        this.gameObject.GetComponent<Image>().sprite = Resources.Load<Sprite>(filePathPrefix + FilePath);
        iTween.RotateTo(this.gameObject, iTween.Hash(
         "y", 0, "time", 0.2f,
          "oncompletetarget", this.gameObject,
          "delay", 0.01f
       ));
    }

今ひとつRotateの動きを理解していないが、何となくめくれてるように見えるのでいいかなぁ(・∀・)といういい加減な実装。後半部分の値を180度にするとカードの絵が鏡絵になってしまうし。fromを指定すればいいのか?

まあ、そもそも後半はアニメーションせずにそのまま表面を表示してしまってもいいのかもしれない。


途中、Editorで実行も出来るし、ビルド&ランも出来るのに、なぜかVS上ではiTweenに赤い波下線が出てCS0103エラーが表示される謎の現象が。後から作成したC#スクリプトファイル上では問題ないのに、元から有るファイル上でiTweenが見えないみたいな感じだった。

日本語コメントを削ったり、再起動しても解決しなかったので諦めて他のことをやった時だったか前のバージョンをチェックアウトしたら消えたけど、あれはなんだったんだろうか(´・ω・`)?

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

    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;
        }
    }
}

この内容が正しいかどうかは解らない(ノ∀`)
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;
    }

    void OnGUI()
    {
        GUI.TextField(new Rect(100, 100, 200, 200), Screen.width + ":" + Screen.height,style);
    }

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