年: 2018年

最終教師 / 山本貴嗣

最終教師

清楚な外見にして実は総番であるブルマー少女・白鳥雛子が、荒廃した学園を建て直す(?)為に派遣されてきたゴキブリ改造人間・茶羽顔八とバトルし続けるギャグ漫画。

全三巻。正確にはPart1が全二巻でPart2が全一巻。セールの時に32+10+10=52円で買うた。マンガ図書館Zでも読めるようだが、表紙がなんか違うような気がするから、出版社が違うバージョン?


白鳥雛子
真面目そうな外見とは裏腹に私立帝王学園高校を取り仕切る総番。何故にブルマーを穿いているかと言えば…まあ、在り来りな理由であるw

顔八と渡り合える高い戦闘能力を持つが、なんでそこまで強いかは謎w

ちなみにPart1の舞台は私立帝王学園高校で後から顔八が赴任して来る流れだが、Part2では顔八が牛耳る私立最終学園に雛子が転校して来る展開。

茶羽顔八

遺伝子実験の結果生み出された改造人間。嵐に紛れて脱走し、数年後、茶羽顔八として現れた。ゴキブリとの掛け合わせの為、生命力が高く、しぶとい。何故に教師を志したかは不明w

笑った顔はやや小林まこと風。


狩魔無礼
結婚式場を装った遺伝子工学研究所・梅雄会館の所員。顔八を追い続けている。

髪型の所為か、最初の登場シーンはブラック・エンジェルズ末期に出て来るモジャ頭キャラ・運命を彷彿とさせる。

今年の始めに亡くなった、作者と劇画村塾で同期であった漫画原作者・狩撫麻礼がモデル…なのか、ただ名前をもじっただけなのかは不明。


梅吉
雛子の子分。顔に似合わず役に立つ男。

渡辺隆一
雛子の子分。帝王学園のインテリの神様と呼ばれている。二巻では何故か巨漢のデブっぽい体型になっている。
私立最終学園の文化部
顔八によって支配された私立最終学園で非行生徒として追い詰められていた文化部の面々。
園芸部 鍬形満、家庭科部 団厨太、文芸部 五月メイ、帰宅部 寝虎。

凄く疑問に感じているのはこの絵柄。なんか細野不二彦っぽい。
3巻は2巻が出てから5年ほど経ってから執筆された作品らしく絵柄が全体的に違うんだけども、寝虎は特に細野不二彦っぽいw
作者が絵柄を変えたのか、それともアシスタントがこういう感じの絵を描くのか…

エルフ・17」とも「SABER CATS」とも何か違う絵柄なんだよなぁ(´・ω・`)


こういう「これは…の分、これは…の分…」的展開の大元の作品は何だろう?
漫画なのか映画なのか…


まあ学園ドタバタ格闘コメディ物なので、そういうのが嫌いでなければ十分楽しめるのではなかろうか。まあ短いのが難か。短編も何本か収録されていたな、そう言えば。

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

なんちゃってDialogが一応出来た気がする(´・ω・`)

Dialogを実装しようとぐぐってみると、色々と実現方法はあったものの、ほとんどがCanvasを使ったりプラグインを追加してネイティブのDialogを呼び出すものであった為に

俺氏、全てを拒絶する(`・ω・´)イヤヤ

今考えてみると、素直にどっちかの方式に従っておけば、さっさと次の機能実装に取り掛かれたのであったが、俺氏は何故か

IMGUIで実装したかった(`・ω・´)
だっておら、onGUI()で実装出来たら楽だなって思ってたから(´・ω・`)ジツハギャクニメンドウクサカッタ

結果的に調べたり試行錯誤を繰り返したりで一日以上を費やしてしまった…_| ̄|○


IMGUIを使用したなんちゃってDialog
事の始まりはこちらのエントリ。
Unityゲームを終了する

この方法で取り敢えずBackButtonからのDialogっぽいモノを表示、GUI.Buttonをクリックしたらアプリケーションが終了するという形までは出来た。

ここで問題になったのは、ボタンクリック後、下のカードのTouchCard()が呼ばれてしまうこと(´・ω・`)
最初はクリックイベントが透過しちゃうのが原因なのかなと思って、EventSystem.IsPointerOverGameObjectでも使えばいいのかと考えたが、イマイチ使い方が解らない(´・ω・`)

参考にしたエントリのコード同様にGameManagerにbool型のisOpenedを作成して、TouchCard()内で

        if (GameManager.isOpened)
        {
            return;
        }

みたいな感じにしてるのに、なんか上手く行かない(´・ω・`)
凄く速くタッチすると下がめくれないことがあったりしたので、もしかしたらisOpenedがfalseになった瞬間にまだ指がタッチしていてそれが拾われちゃうのかとも思ったが、どうも必ずしもそうでもないような…(ヽ'ω`)ワカラナイ

で、まぁ色々悩んだ末に考えついたことは、
Delay入れれば、弾けるんじゃね(・∀・)?
といういい加減極まりない手法w


コルーチンによるボタンクリックアニメ

というわけでStartCoroutine+WaitForSecondsをクリック後に追加した。結果、isOpenedがfalseになるのが遅延して余計なクリックイベントを弾くようになった模様…実際にこの対処法が正しいのかは不明(´・ω・`)

参考:
Unityで一定時間待つ処理の実装方法
【Unity】スクリプトの処理の実行タイミングを操作する

で、ここでふと思ったのが、

WaitForSecondsを二回呼んで、その間にボタンのテクスチャを描き換えれば、ボタンクリックアニメっぽくなるんじゃね(・∀・)?
ということ。

ちょろっとやってみた。
それっぽくなった(・∀・) オレシカコイイ ダイテ(・∀・)


else節を利用したボタン押下アニメ
で、まぁ人の欲望とは際限なきもので、ボタンクリックアニメが出来るようになると今度はボタン押下状態のアニメというか画像変更がしたくなってくる(´・ω・`)タルコトヲシラヌ ヨクブカモノ

色々とぐぐっても、今ひとつGUI.Buttonの実体というか押下イベント状態を掴む方法が解らない(ヽ'ω`)

UnityのマニュアルでImmediate Mode GUI (IMGUI)の項を読む……

IMGUI システムは通常、プレイヤーが操作する普通のゲーム内ユーザーインターフェイスに使う事は意図されていません。それらにはゲームオブジェクトベースで考えられた Unity のメイン UI system を使ってください。そちらの方が UI 要素の編集と位置決めにゲームオブジェクトベースでアプローチでき、 UI のレイアウトと視覚デザインをするのにはより便利なツールです。

ガ━━(゚Д゚;)━━━ン!!

_| ̄|○

ぐぐってみても、そういうボタン押下状態の画像差し替えのコードはない…(ヽ'ω`)

実体もしくは押下イベント状態を掴む方法がないとなぁ…(´・ω・`)と半ば諦めかけていた時にふと思う。
GUI.Buttonって

if (GUI.Button (Rect (25, 25, 100, 30), "Button")){}

みたいな感じで書いて、クリックされている時は{}内のコードが実行される…
じゃあ、elseの時はどうなんの……

あ、ここでクリックではない時の実体(?)がつかめんじゃね(・∀・)?
と思う。

でまぁ、elseの部分でこのボタンのテクスチャやフォントサイズを変えればいいということに気付く。
具体的にはbool型のisPressedみたいな変数を追加し、

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            isPressed = true;
        }
        if (Input.GetMouseButtonUp(0))
        {
            isPressed = false;
        }
    }

で状態を格納するようにして、かつ、Input.mousePositionがボタンのRect内であるならばボタン押下状態とみなすという形でチェックし、trueならPressed状態、falseならNormal状態のGUIStyleをセットすることによって実現した(`・ω・´)

これが上手く動いた時は
俺氏天才(`・ω・´)
って思った。←こうやって自画自賛しないとやってられない人


面倒くさいので、サンプル用に削ったコードを作成せずそのまま載せるw

  1. Resourceフォルダの下にimagesフォルダを掘って、そこに以下の画像を突っ込む。押下状態の画像は通常状態の画像を反転しただけw Rect用のテクスチャ同様にコード内で生成してしまえば、完全にスクリプトだけで完結するなんちゃってダイアログが作れる。ちなみにアクアなボタン台 フリー素材のボタンをかっぱらってきて、ちょっと加工した(・∀・)


  2. GameManager側では
     
        void OnGUI()
        {
            float sw = Screen.width;
            float sh = Screen.height;
    
            if (GUI.Button(new Rect(0, 0, sw * 3 / 12, sh / 12), "menu") && !isOpened)
            {
                Debug.Log("push!");
                this.gameObject.AddComponent<MenuDialog>();
                isOpened = true;
                return;
            }
        }
    

    という感じでGUIボタンで呼び出す様にしたり、Androidの実機のBackボタンで試すなら

    #if UNITY_ANDROID
            if (Input.GetKeyDown(KeyCode.Escape))
            {
                this.gameObject.AddComponent<MenuDialog>();
                isOpened = true;
                return;
            }
    #endif
    

    をupdate()に追加する。isOpened自体はこのサンプルでは本当は必要ないのだけれども、そこら辺を修正するのが面倒なのでどっかで宣言しておく。

  3. よく解ってないのだがY座標は画面下から上に増加していく座標のようなので、ボタン領域内のチェックはScreenheightから引いて逆転させている(´・ω・`)ココハジブンデモリカイシテナイw
    using System.Collections;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class MenuDialog : MonoBehaviour
    {
        private GUIStyle rectStyle = new GUIStyle();
        private GUIStyle quitStyle = new GUIStyle();
        private GUIStyle returnStyle = new GUIStyle();
        private GUIStyle cancelStyle = new GUIStyle();
    
        private float dialogWidth = 500;
        private float dialogHeight = 800;
        private float dialogLeft;
        private float dialogTop;
        private float buttonLeft;
    
        private float buttonWidth = 368;
        private float buttonHeight = 83;
        
        bool isPressed;
    
        void Start()
        {
            GUIStyleState rectStyleState = new GUIStyleState();
            rectStyleState.textColor = Color.white;
            rectStyleState.background = MakeRectTexture();
            rectStyle.normal = rectStyleState;
    
            SetTextConfig(rectStyle, 50, TextAnchor.MiddleCenter);
            SetTextConfig(quitStyle, 50, TextAnchor.MiddleCenter);
            SetTextConfig(cancelStyle, 50, TextAnchor.MiddleCenter);
            SetTextConfig(returnStyle, 50, TextAnchor.MiddleCenter);
        }
    
        Texture2D MakeRectTexture()
        {
            Texture2D rectTexture = new Texture2D(16, 16);
            for (int y = 0; y < rectTexture.height; y++)
            {
                for (int x = 0; x < rectTexture.width; x++)
                {
                    if (x == 0)
                    {
                        rectTexture.SetPixel(x, y, Color.white);
                    }
                    else if (x == rectTexture.width - 1)
                    {
                        rectTexture.SetPixel(x, y, Color.gray);
                    }
                    else
                    {
                        if (y == 0)
                        {
                            rectTexture.SetPixel(x, y, Color.gray);
                        }
                        else if (y == rectTexture.height - 1)
                        {
                            rectTexture.SetPixel(x, y, Color.white);
                        }
                        else
                        {
                            rectTexture.SetPixel(x, y, new Color(1f, 0f, 0f, 0.5f));
                        }
                    }
                }
            }
            rectTexture.Apply();
            return rectTexture;
        }
    
        void SetTextConfig(GUIStyle targetStyle, int fontSize, TextAnchor textAnchor)
        {
            targetStyle.fontSize = fontSize;
            targetStyle.alignment = textAnchor;
        }
    
        void MakeStyleNormal(GUIStyle targetStyle, Color color,Texture2D texture,int fontsize, TextAnchor textAnchor)
        {
            GUIStyleState tempStyleState = new GUIStyleState();
            tempStyleState.textColor = color;
            tempStyleState.background = texture;
            targetStyle.fontSize = fontsize;
            targetStyle.alignment = textAnchor;
            targetStyle.normal = tempStyleState;
        }
        
        bool CheckIsInButton(int y)
        {
            if (isPressed &&
                buttonLeft < Input.mousePosition.x &&
                buttonLeft + buttonWidth > Input.mousePosition.x &&
                Screen.height - (dialogTop + buttonHeight * y) > Input.mousePosition.y &&
                Screen.height - (dialogTop + buttonHeight * y + buttonHeight) < Input.mousePosition.y)
            {
                return true;
            }
            return false;
        }
    
    
        void OnGUI()
        {
            dialogLeft = Screen.width / 2 - dialogWidth / 2;
            dialogTop = Screen.height / 2 - dialogHeight / 2;
            buttonLeft = dialogLeft + dialogWidth / 2 - buttonWidth / 2;
    
            GUI.Box(new Rect(dialogLeft, dialogTop, dialogWidth, dialogHeight), "TestDialog", rectStyle);
    
            if (GUI.Button(new Rect(buttonLeft,
                dialogTop + buttonHeight * 2, buttonWidth, buttonHeight), "quit", quitStyle))
            {
                ChangeButtonStyleState(quitStyle, null, "images/quit2");
                StartCoroutine(DoDelayedMethod(quitStyle, Color.white, "images/quit", (0.1f)));
                Application.Quit();
            }
            else
            {
                if (CheckIsInButton(2))
                {
                    ChangeButtonStyleState(quitStyle, null, "images/quit2");
                }
                else
                {
                    ChangeButtonStyleState(quitStyle, Color.white, "images/quit");
                }
            }
    
            if (GUI.Button(new Rect(buttonLeft,
                dialogTop + buttonHeight * 4, buttonWidth, buttonHeight), "cancel", cancelStyle))
            {
                ChangeButtonStyleState(cancelStyle, null, "images/cancel2");
                StartCoroutine(DoDelayedMethod(cancelStyle, Color.white, "images/cancel", (0.1f)));
            }
            else
            {      
                if (CheckIsInButton(4))
                {
                    ChangeButtonStyleState(cancelStyle, null, "images/cancel2");
                }
                else
                {
                    ChangeButtonStyleState(cancelStyle, Color.white, "images/cancel");
                }
    
            }
    
            if (GUI.Button(new Rect(buttonLeft,
                dialogTop + buttonHeight * 6, buttonWidth, buttonHeight), "return", returnStyle))
            {
                ChangeButtonStyleState(returnStyle, null, "images/return2");
                StartCoroutine(DoDelayedMethod(returnStyle, Color.white, "images/return", (0.1f)));
                SceneManager.LoadScene("TitleScreen");
            }
            else
            {
                if (CheckIsInButton(6))
                {
                    ChangeButtonStyleState(returnStyle, null, "images/return2");
                }
                else
                {
                    ChangeButtonStyleState(returnStyle, Color.white, "images/return");
                }
            }
        }
    
        void ChangeButtonStyleState(GUIStyle targetStyle, Color? pressedFontColor, string FilePath)
        {
            GUIStyleState pressedButtonStyleState = new GUIStyleState();
            if (pressedFontColor != null)
            {
                pressedButtonStyleState.textColor = (Color)pressedFontColor;
            }
    
            pressedButtonStyleState.background = (Texture2D)Resources.Load<Texture>(FilePath);
            targetStyle.normal = pressedButtonStyleState;
        }
    
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
                isPressed = true;
            }
            if (Input.GetMouseButtonUp(0))
            {
                isPressed = false;
            }
        }
    
        private IEnumerator DoDelayedMethod(GUIStyle targetStyle, Color? tempFontColor, string FilePath, float waitTime)
        {
            yield return new WaitForSeconds(waitTime);
            GUIStyleState tempButtonStyleState = new GUIStyleState();
            
            if (tempButtonStyleState != null)
            {
                ChangeButtonStyleState(targetStyle, tempFontColor, FilePath);
            }
            yield return new WaitForSeconds(waitTime);
            GameManager.isOpened = false;
            Destroy(this);
        }
    }
    

    参考:

    テクスチャの作成
    Textureを変更する


テクスチャの作り方を完全には理解していないので、その辺は参考サイトのコードを適当にいじって背景Rect用テクスチャを作った(ノ∀`)
背景Rect用テクスチャをきちんとした画像を用意して読み込んだり、setPixel()で頑張るかすれば、もっとちゃんとした外観になるはず。

テクスチャの透過はシェーダーをどうにかしないといけないとか面倒臭そうだったので四角いボタンにしたが、テクスチャを角丸画像にして背景色を背景Rect用テクスチャのものと同一にして多少のクリック判定の誤差を諦めるか、ボタン押下状態の背景Rect用テクスチャを用意してクリック時に同時に背景Rect用テクスチャも切り替えれば角丸ボタンも実装出来るんじゃないかなぁ( ゜σ・゚)ホジホジ ←今のところ、実装する気がない。

※2018/7/3追記
結局テクスチャをプログラムで生成する形にしたが、SetPixelでColor.clearをセットすると透過みたいになっている……ような気がする……がイマイチ状況を把握出来ていない(ノ∀`)

多分デリゲートとかをちゃんと理解している人ならもっとスマートな書き方が出来るのだろうが、俺氏には無理なので旧態依然とした因数分解的リファクタリングしか出来なかった(ノ∀`)


えらく長くなったが、これで今後このコードの意味がわからなくなっても、この経緯を読み直せば理解出来るはず( ・´ω・`)

何はともあれIMGUIとの戦いは勝ったわけでもないが

敗けなかった(`・ω・´) と思いたい。

テイルズオブファンタジアをやった(終)

水鏡の森ユミルへ。またもアーチェはメンバーから外れる。
何も売ってくれない弓屋にチェスターの弓の修理を頼む。20000ガルドくらいだったか?
一泊しないといけないのか。右端の家は「倉庫か…」みたいなことを言っているんだけども、煙突から輪っかの煙が出ている( ・´ω・`)?
何かあるのか、ただのミスなのか…

食材屋でメロンを購入。どっかでメロン買って来いとか言われてたな。
料理人からフルーツパフェを習う。

宿屋でアーチェのお母さんからアーチェ用のアイテムを貰う。さっき、雑貨屋でなんか買ってしまったような…まあいいか(´・ω・`)
ブラムバルドがハーフエルフ受け入れについて議論中。
なぜ宿屋で…と思わぬこともない(´・ω・`)

弓はエルヴンボウになって返ってきた。
クレセントアローより強いけど、クレセントアローは光属性だから取っておくか。
ダオスが出て来たらしい洞窟で役立ちそう。

適当にウロウロしていたら、すずが出て来た(・∀・)
結局アーチェも来たのかw

って忍者の里にワープΣ(゚∀゚;)

なんだこの罠だらけの廊下w
ってすずの不手際かw

頭領の名は藤林乱蔵…特に連想する名前はないな。
温泉て、幻想水滸伝か、お前らは。
タオルつけたまま入んなヽ(`Д´)ノ
非常にありがちな展開ですな(・∀・)

洗脳とマインドコントロールはちょっと違うような(´・ω・`)

工エエェェ(´д`)ェェエエ工
この終盤に来て、人探しぃぃぃぃ?
どうせダオスに操られたすずの両親と戦わないといけないんでしょ?
めどいなぁ…(´・ω・`)マアサガシマスケド

父が銅蔵で母がおきよ、ユークリッド周辺と…φ(・ω・` )メモメモ…
ムラマサ来ちゃったよ、これ
でもムラマサ、レーザーブレイドより弱いんだけど…?
ルーンボトルでマサムネになったりするのか?

すず11歳なのか…

ダオスじゃなくて目玉の化物?バックベアードが( ・´ω・`)?
( ゚Д゚)ハッ それならすずが11歳という設定も納得がいく(`・ω・´)コノロリコンドモメ!!

おふゆからみそおでんを習う。

ここの宝箱も取れないな(´・ω・`)
ソーサラーリングで鶏を焼きチキンにしたろうと思ったけど出来なかった…残念
そういやどっかの蟹の宝箱も取ってないな。

村の西の方でアースクェイクの呪文書を(σ・∀・)σゲッツ!!
つーかどうやって帰るんだろう。南方向に行けばいいのか?

BCロッドってブルークリスタルロッドかw

結局、村の南方向からしか帰れないんだということに気づき、南へ行くとすずが来て送ってくれるとのこと。ユミルの森の外まで連れて行ってもらうとしよう。


なんかユークリッド城で武術大会やってる。8回連続で勝つのかメドイなぁ(´・ω・`)
イシュタル伝説ネタはBCロッドだけじゃないのか?
ブルーキャンドルを入手しないとアーリィ近くの迷宮は攻略出来ないのか?

ユークリッド王の前に行ったらストーリーが展開したΣ(゚∀゚;)
ユークリッド王と話すのは今回が初めてだったか。

資金援助してくれるというから遠慮なくもらったが、80000ガルドかぁ…(´・ω・`)

武術大会参加しないと話が進まないのかな?
そこですずの両親が出て来るのか?

料理人からステーキを習う。
地下墓地…?

武術大会一回目
二回戦目くらいまで余裕だったので、目を離していたら何回戦めかで敗けて医務室に運ばれた(ノ∀`)

もう一度挑戦して解ったが三回戦目で麻痺って敗けたんだなw
また敗けたよ…_| ̄|○

ホーリーシンボルx2を外して、パラライチェックとストーンチェックつけるかな。

7回戦目までは特に問題なかったが、8回戦目のバジリスクキングが…
装備していたフランヴェルジュだとダメージを与えられずに回復させてしまう…( ;・´ω・`)ゴクリッ
やり直しかなと思ったが、なんかバリア系だとダメージを与えられることが観ていて解ったので、フレアボトルを飲み、守護方陣をひたすら使いまくって何とか勝利する(`・ω・´)

ってすずの両親が襲って来たよ…ここでか( ;・´ω・`)ゴクリッ
おきよは倒せたけど、やられた…_| ̄|○

ってやっぱりさすがにイベントバトルだよなw

すず…(´・ω・`)

なんだ今の光は…空の人が死体回収してくれたんか?
忍びの里にまた行かないと仲間にならんのか。めどい(´・ω・`)


お、今回はエルフの村からワープ出来た(・∀・)チョットラク
お頭から襲爪雷斬破の奥義を貰う。
すずが仲間になって、また温泉。

今回は逆パターンかw

またチャネリングもらったけど、未だに何に使うのか解らない(´・ω・`)
そろそろぐぐってもいいかもしれないw ←※なんか2コンで装備しているキャラを操作できるとかどうとか

井戸の中に試練の洞窟があると…φ(・ω・` )メモメモ…
行こうと思ったらまだその資格がないとのこと。
すずは忍術書で忍術を覚えるのか…

何も考えずに外に出てしまったが、オリジンってトレントの森に居るんだかどうだかって話だったな…
まあいいや…ちょっとさすらうか。
つーかこのゲーム長いな…(ヽ'ω`)

浸食洞の小島に行ったらお弁当イベント発生。
何故か料理人が居て、にくなべを習う。

トールに戻ったら、入れなかった建物に入れるようになっていた。もしかするとタイムワープ後に侵入可能だったのかも。
料理マシンからフルーツポンチを習う。

アスカは何処に捕らえられてるんだろう(´・ω・`)
過去に戻ろうと思ってコモンルームに行こうとするが行けず…
諦めて忍者の里に戻るもオリジンの手がかりを得られず。
トレントの森に戻ってうろつくしかないのかな?

取り敢えずセーブして終了(´・ω・`)ネムイ


井戸の底にオリジン居るのかなと思って、入る条件である忍術を探しに行く。
だが見つからない(´・ω・`)

アルヴァニスタでヘイムダールに居るんじゃね?と言われて( ゚Д゚)ハッと気づく。
でもハーフエルフ問題が解決してないしな。ブラムバルドは相手してくれるのだろうか。
適当にうろついて小島(河州?)に行ったが何もなし。
会ったことのないドワーフ風の旅人が居たが、ここには何もないと言われる。
そう言えばどっかでアイフリードの息子が居るとかどうとか聞いたな(´・ω・`)

闇の洞窟?の先へ進むも扉が開かず。メッセージがあったので読んだがよく解らない。
赤い光ってソーサラーリングじゃないのか…

ミッドガルズの大陸にも何もない波打ち際を発見。アイフリード絡みなのかな?
さっきの旅人のところに行ったら獅子飛燕脚を12000ガルドくらいで売ってくれた。

モーリア坑道へ行くも何もなし(´・ω・`)
段々面倒くさくなってきて、ぐぐるw ←一回ぐぐると以降、攻略を見ることに抵抗がなくなるタイプ ←簡単に身を持ち崩すタイプとも言える(ノ∀`)

ぐぐって愕然とすΣ(゚∀゚;)

そうだった…ヘイムダールへは動物の居るところを歩いて行くんだった…_| ̄|○
でもあれもいまいちわかりにくいんだよなぁ(´・ω・`)
前回も適当に歩いていたら着いただけだったような…
つーかよくよく考えてみたら、忍者の里へ行くために右回りで来た時に再訪していたような…(ヽ'ω`)

オリジンは中々強かったがなんとか勝てた(・∀・)
HP45000くらいで無属性だった。タイミングの問題なのかこちらの魔法が効かないことがあったような。属性が切り替わってるんだろうか?取り敢えず光系は回復しちゃうので駄目ぽかった。

エターナルソード(σ・∀・)σゲッツ!!
空間翔転移、時空蒼破斬、転移蒼破斬を覚える。
ところでエターナルソードが悪しき心の持ち主を斬る云々て言ってたけど、ダオスは悪しき心の持ち主なんだろうか(´・ω・`)? ダオストクレスノエターナル?

ルーングロムさんにダオスの手掛かりを聞きに行く。
アーリィなる闇に包まれた街……
もう何回も行ってるところやん(´・ω・`)

宿屋で泊まろうというので泊まる。
ミントからなんかお話が(*´・ω・)キタイシテイイ?

クラースはミラルドを覗き見というか、過去を覗き見。
ミラルド「見ているな、クラース(`・ω´・ )」

アーチェとチェスターがイチャモメしとる(´・ω・`)
そう言えばすずは?

あれ、イヤリングはミントが持ってたのか…
じゃあ、闇の迷宮?のあの扉はイヤリングで開く?
いや、赤い光がどうとか言ってたしな…

あ、すず居た…


北西の洞窟の先にダオスの城が…(´・ω・`)?

お、城が出て来た。

ダークアイ?はHP56000くらいだったが、特に強くなかったな。
左の方に行ったら牢屋みたいなところに…
もしかして過去のあそこ?
と思ったが全然関係ない模様w

宝箱を取ったりして、他のことをしながらやっていたら、プロフェットにエクスプロードを連発されて全滅した(ノ∀`)

呪文書メテオスォームを(σ・∀・)σゲッツ!!

セーブポイントがあったから、もうダオスかなと思ったらワープ。牢屋のとこ?
ちょっと歩いたらモンスターとエンカウントして気付く。一人きりやないかヽ(`Д´)ノ

なんかイベントアイテムがないと魔法陣を越せないらしい(´・ω・`)

何回か周り直してみたが何も見つからず。一旦、街に帰ってみたが何もなさそう。
持っているアイテムを眺める……

デリスエンブレム(´・ω・`)?
今まで使ったことなかったし、装備して突っ込むとビンゴ(`・ω・´)

ひゃっはーと思って左に進んだら、また一人きりでエンカウントして全滅させられる…(ヽ'ω`)

今度は上の方に行ったら宝箱が。ハンゾウが出て来たけど一体だけだったので余裕で勝つ(`・ω・´)

宝箱の中身は何となく予想していたがデリスエンブレムだったw
また牢屋に行って仲間をサルベージしてデリスエンブレムを装備させて人数分拾って来るという流れかな?

取り敢えず、セーブポイントまで戻ってセーブをし、デリスエンブレムを外して再び魔法陣?に突っ込むかと思ったら、敵とエンカウント(ヽ'ω`)

ROAMEYE?とか言う奴で18600くらい。
特に問題なく倒せたが、獲得アイテムで驚愕する…

デリスエンブレムやないかΣ(゚∀゚;)

( ´・ω・)エ? 普通に獲得出来ちゃうアイテムなのか?
結局ROAMEYE?ともう一回遭遇し、宝箱の中にあったものも全部回収したので、デリスエンブレムは8個になった(ノ∀`)


2回ほどアークビショップのタイムストップで全滅(ヽ'ω`)

SEALEYE?とかいうのが居た。
HP62000が2体か(´・ω・`)メドイ
レバーを動かしたら、階段途中の扉が開いた。

一番奥まで行って、順番というか適当に赤いボタンを踏んで扉を開けた。ああ、"終わりより始まる"ってそういうことか。
鏡の世界を進むとまたSEALEYE?が居た。
倒したら碑文が。
下へ降りる階段のある部屋に隠し通路があると…φ(・ω・` )メモメモ…

ダオス HP70000はそれほど苦労せず倒せた。

あーダオスは空の人なのか(´・ω・`)

フェザーダオスもそれほど苦労せずに倒せた…
って第三段階あんのかよ(´・ω・`)

第三段階はちょっと危ない時もあったけど何とか倒せた。

んー(´・ω・`)
結局のところ、ダオスはただの侵略者じゃないか…

そうか、すずはこの時代の人間だったな…(´・ω・`)

ああ、クラースとアーチェもここでお別れか…
アーチェはお母さんと会えたのか(´・ω・`)ヨカッタヨカッタ

ん、ダオス…
ああマーテルさんか

あ、オタワ(´・ω・`)


感想はつまらなくはなかったくらい。
なんとなーく、色んなRPGの要素をぱくってるように思えるけれども気の所為かしら(´・ω・`)?
少なからずテイルズオブデスティニーのリメイク版よりかは楽しめたかなぁ。
でもやっぱなんか1作が長いな、このシリーズ(´・ω・`)

テイルズ オブ ファンタジア とかを読むとSFC版とPS版に結構大きな差異が存在してるみたいだなぁ。

ゲーム終了後にフェイスチャットシステムが存在していたことに気付く( ;・´ω・`)ゴクリッ
まあいいかw

チェスターの妹話とかってあんまり関係してこなかったな…(´・ω・`)
別にアーチェとかすずにアミィの姿を重ねるようなこともなく。もしかしたら見逃したエピソードがあるのかな?

なんにしてもチェスターとすずは微妙なキャラ設定というか追加要素というか…
すずに関しては、SFC版ではただのサブキャラだったらしいから、しょうがないんだろうけれども、チェスターはなんだかなぁって感じだったw

まあ何はともあれ、
クレスがキャラデザの藤島康介みたいに長く連れ添ったミントを捨てて、若いすずと一緒になる展開じゃなくて良かったです(・∀・)

次はエターニアか…(ヽ'ω`)

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

なんか色々やってたら、何やったか忘れてしまった(´・ω・`)

  • 取り敢えずiTweenをやめて、DTweenを導入した。
  • ヒットしなかった場合のカードの戻りを追加した。
  • ヒットした場合の雑な消滅アニメを追加した。
  • 24枚、36枚、48枚のパターンを作った。
  • 雑なタイトル画面を作った。
  • admobを追加した。
  • Backボタンによるアプリケーションの終了を追加した。
  • Dialogをどうにかしようとしている

くらいかな?

24枚、36枚、48枚でカードサイズを変えた結果、48枚パターン以外では拡大表示が入らなくなったり、配布カードの上にかぶることが判明。まあ24枚と36枚のパターンだとカードの値が見えにくいということもないので、拡大表示しなきゃいいかなぁという結論に。

参考:
DOTween関連
[Unity]DOTweenめーも

[Unity]インスタンス生成時に引数を渡したい

Unity : モバイル画面の方向を固定、あるいは変化を検出

[Unity] AdMob 広告をAndroidに実装する
Android Admobで使うデバイスIDの取得方法(Unity)


ぐるぐる回転

画像を裏返すようなアニメーション
このコードを理解せずに適当に延々と回転し続けるアニメーションを作ろうとしてハマる(ヽ'ω`) 最初の絵が二周目から反転してしまう… そもそも仕組みもこのコードの挙動も理解していないので原因が分からず、最終的に"89"と"-89"にすると反転が起こらず、かつ人間の目には90を指定した時との差はわからない感じだったので、それで良しとした(ノ∀`)


カード裏面

何となくカード裏面も変更出来たらいいのかしらと思いつつ、絵を描くと何故か謎のクリーチャーをこの世に爆誕させてしまう俺氏の才能が怖いので、フラクタルみたいな図柄を自動生成してくれるソフトを探す。最初はApophysis.7X16というソフトを使ってみたのだけれども、あんまり使い方が判らず(´・ω・`)

その後、juxのフリー版を落として来て、色々と触ってたら、そこそこそれっぽい画像が出来たので適当に加工してカードにはめてみた。なんか神々しいというかRPGのラストとかに出て来そうな感じの画像が結構出来たw 原理等は全くわからないけど凄いと思いました(・∀・)(小並感)

でもトランプの裏面って左右対称上下対称が普通だったんだっけか。まあただの神経衰弱ゲームなので細かいことはキニシナイ(・3・) あ、一番最後のはApophysis.7X16で出力した画像を加工したんだっけかな。

ちなみにこの作業で半日以上を潰した(ノ∀`)
理屈が解らないので適当に数値を替えてやっているのはあたかもひたすらガチャを引き続ける人のようであった…


まだまだやることが山程あるな…(ヽ'ω`)