カテゴリー: Unity

うにのトゲは刺さると痛い(´・ω・`)-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()の方でその値を更新すれば画面ログ出力が出来る感じか(´・ω・`)

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

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

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

そう言えば、

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

        if(Input.touchCount >= 1)
        {
            Debug.Log("touchCount: " + 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) {

        if(swipeDir == Vector2.up)
        {
            Debug.Log("swipeDir: up" + swipeDir);
        }

        if (swipeDir == Vector2.right)
        {
            Debug.Log("swipeDir: right" + swipeDir);
        }

        if (swipeDir == Vector2.left)
        {
            Debug.Log("swipeDir: left" + swipeDir);
        }

        if (swipeDir == Vector2.down)
        {
            Debug.Log("swipeDir: down" + swipeDir);
        }
    }
}

このコードは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の使い方を覚えるのがめんどくさいのでこのまま行くしかないか…( ;・´ω・`)ゴクリッ

Unityの寺子屋 定番スマホゲーム開発入門 Kindle版 いたのくまんぼう/大槻有一郎

50%セールの時に¥1,350 でこうたった(`・ω・´)
UnityではじめるC# 基礎編の第二弾らしい。


結論から言うと、良い内容だったと思いました(・∀・) (小並感)

今回は続編ということでC#の説明部分はないのだけれども、本書購入者の為に「UnityではじめるC# 基礎編」のChapter2~3を改変したC#の解説文書PDFを配布してるみたい。俺氏は前作を読んだ直後だったので、これには目を通さなかった。まあでも指示に従って操作をしていけば出来上がるタイプの内容なので前作を読んでいなくても進められないことはないかなぁ?

本書のChapter1は前作と似たようなチュートリアルだったので、軽く流して読んだ。
Chapter2~4は時間経過と共に発生するオーブをスワイプして集めてお寺を大きくするゲームと木魚をクリックするとオーブがお寺に飛んでいくゲームの作り方。後者はDOTweenとか言うUnityのアセットストアで公開されているアセットを使ってオブジェクトの位置を移動させながらアニメーションさせる方法の説明が肝かな。

Chapter5~6はサイドビューアクション、まあスーパーマリオブラザーズライクなゲームの作り方。スクロールに関しては1ページのコラムに書かれてるだけって感じか。まあ、最初から大きいマップを用意して、カメラ(表示画面)をプレイヤーキャラに追随する形にして実現すればいいらしい。

Chapter7はスマホアプリゲームのトレンドと収益を売るためのエトセトラ等々。

完全に右も左も判らないレベルだと難しいかもしれないが、最低ラインのコンピュータ関連の知識があり、Google先生に聞くことが出来る人ならば、きっと最後まで読み進めることは出来ると思う。ただ、多少の説明はあるものの、Unityの体系的な知識はあんまり得られないと思うので、そういうのを求める人向きではない。取り敢えず”習うより慣れろ”的にチュートリアルに従って、完成時に小さな成功体験を得て、更に先へ進むのが合っている人向きだと思った。


サンプルデータと正誤情報は
Unityの寺子屋 定番スマホゲーム開発入門 正誤情報

…のはずなんだけども、なんかおかしい(´・ω・`)
この本を読む前に行った時は正誤情報がなくてUnityTera.zipがあったような気がするんだけども、今回行ってみたら正誤情報があって、データがないような……
違うページを見てたのかな…?

致命的な問題はなかったかな。今回も細かいどうでも良い隅つつきを。正誤情報に載っているのは除く。つーかP203のやつ以外、気が付かなかったw あと単純に俺氏が勘違いしてる部分もあるかもしれないw

  • P44 図2-23で、[pos.y]の値が本文・設定値では”250″なのに、吹き出しでは”-250”になっている。本文や画像の方が正しい。
  • P62 “RefreshTextメソッドを追加”は”RefreshScoreTextメソッドを追加”
  • P70 間違い、誤植等ではないが、構造体がいきなり出て来て、最初はクラスかと思った(´・ω・`)チョットチガウノネ
  • P79 コード2-13 なんか下の”imageTemple”の行の文字間かなんかが上と違う気がする。これは二行に渡っているから?
  • P244 図5-123 吹き出しでは”天地中央に設定”とあるが、画像では”天地中央”じゃないような気がするんだけども、上寄せ?が”天地中央”?
  • P258-259 キーフレームのところで、P258の本文では”0.15″と”0.3″だが、P259では”0.1″と”0.2″になっている?
  • P262 “地面に設定”は”地面に接地”?
  • P271 流れ的に記載されていなくて当然だったが、PlayerオブジェクトにAudioSourceを追加をし忘れてエラーになった(ノ∀`)

くらいだったかな。

P179のBlockのコピーは縦に3つ、コピー&ペーストして、pos.xの値に0.8を足していく方が楽だったかな。stage2のマップの時は横一列のオブジェクト群をコピー&ペーストしてpos.yの値に0.8*マス数を足した。もっと楽な方法ないのだろうか(´・ω・`)

P262でExitが見えない時の対処方法が書いてあったのを見落とし、どうするうんだべ(´・ω・`)?と悩んだ挙句に違う方法でExitを表示させた(ノ∀`)
なんか目のアイコンで表示領域が切り替わるみたいだった。


なんか作ってみようかなぁという気持ちと前に途中まで作っていたJavaのAndroid用ライブラリの続きもやんなきゃなぁ、つーか仕事探さないとなぁって感じであれです(・∀・)

そういえば200円で買って来たUnity4の本もあるから、あれも目を通すかなヽ( ・∀・)ノ