「ノベじゃむ」タグのついた投稿

タイトル通りですが、8月末に行われたノベじゃむと言うイベントで制作した「ヒミツのおまじない」と言うゲームをGoogle Playにて配信開始しました!

scr0

リンク:

https://play.google.com/store/apps/details?id=com.Studio6Pm.Omajinai

 

内容としてはコテコテのノベルゲームで、話も学園、男女幼馴染、「(校長)占い」という様なベタな感じになってます(最後は違う?)。

 

ゲームジャムでからの変更点は殆ど無く、基本的にはバグ修正、個人的に宴を弄って遊んで実装したオマケ機能、1枚イラスト追加になっています。

シナリオは誤字修正ぐらいになっているので、初対面でも有能な人たち(自分以外)が集まれば30時間以内でこのレベルの物も作れる時が有るんだ!みたいな感じになっていますので、良かったら遊んでみてください。

何か意見や感想等ありましたら、コメントください。

前回のノベじゃむ記事に引き続き、宴ネタです。

ジャム中とその後にゲームを遊んでみた時に宴のデフォルト環境で気になって変更を加えて見た所を紹介します。

 

[テキストが全部表示された後に出るカーソルを動かしたい]

blg1 - コピー(この白い逆三角形のアイコンです)

 

これは唯一ジャム中に実装した超どうでも良い機能です。

上記の画像にあるアイコンが止ったままだと何か動かしたい衝動に駆られました。

幽霊の住む家を作った時もこのアイコン移動を入れてた影響な気もします。

 

実装ですが、まず宴で生成したシーン内のアイコンを探し当てます

blg6

 

“IconRoot”の下にある”IconBrPage”と言うゲームオブジェクトが目標のアイコンです。

今回はジャムで実装した方法をそのまま載せます。まず、動かす処理を実装します。

アイコンを動かすにはiTweenの機能を使用します。iTween自体は宴に入っているので、新規に追加する必要はありません。

iTweenでやる事は指定した移動量を移動し、移動が終わったら今度は逆方向に移動を開始する、を繰り返します。

 

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

public class IconMover 
    : MonoBehaviour 
{
    [SerializeField]
    Vector3 m_moveAmount; // 移動量

    [SerializeField]
    float m_duration; // 移動時間
    RectTransform m_transform;

    void Awake() 
    {
        m_transform = GetComponent<RectTransform>();
    }

    private void StartMove()
    {
        Hashtable table = new Hashtable();
        table.Add("time", m_duration);
        table.Add("position", m_transform.position + m_moveAmount);
        table.Add("easetype", iTween.EaseType.easeInOutCubic);
        table.Add("oncomplete", "OnTweenEnd");
        iTween.MoveTo(gameObject, table); 
    }

    private void OnTweenEnd()
    {
        m_moveAmount *= -1.0f;
        StartMove();
    }
}

 

Start()でなくAwake()を使用しているのは、ゲームオブジェクトのactiveが頻繁にtrue/falseを行き来するからです。

これで後はAwake()時にStartMove()を呼べば良さそうですが、このアイコンはテキストの一番を後ろに移動するようになっている為、直ぐに移動すると開始位置がずれてオカシナ移動を行います。

なので回避方法としてAwake()から数フレーム(今回は10を指定しました)待ち、その後に移動を開始しました。

面倒なのでクラス全部乗せます

 

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

public class IconMover 
    : MonoBehaviour 
{
    [SerializeField]
    Vector3 m_moveAmount; // 移動量
    Vector3 m_startPos;

    [SerializeField]
    float m_duration; // 移動時間
    RectTransform m_transform;
    
    [SerializeField]
    int m_startFrame;
    int m_frameCount;

    void Awake() 
    {
        m_transform = GetComponent<RectTransform>();
        m_frameCount = 0;
    }

    void OnEnable()
    {
        m_frameCount = 0;
    }

    void OnDisable()
    {
        m_frameCount = 0;
        iTween.Stop(gameObject);
        m_transform.position = m_startPos;
    }

    private void StartMove()
    {
        Hashtable table = new Hashtable();
        table.Add("time", m_duration);
        table.Add("position", m_transform.position + m_moveAmount);
        table.Add("easetype", iTween.EaseType.easeInOutCubic);
        table.Add("oncomplete", "OnTweenEnd");
        iTween.MoveTo(gameObject, table); 
    }

    private void OnTweenEnd()
    {
        m_moveAmount *= -1.0f;
        StartMove();
    }

    void Update()
    {
        if (m_frameCount < m_startFrame)
        {
            m_frameCount++;
            return;
        }

        if (m_frameCount == m_startFrame)
        {
            m_startPos = m_transform.position;
            StartMove();
            m_frameCount++;
        }
    }
}

 

ちなみに、ゲームオブジェクトが非アクティブになった時はOnDisable()でiTweenの移動を停止し、位置を移動開始前の位置に戻しています。

このスクリプトを”IconBrPage”の親の”IconRoot”にアタッチし、移動量と開始待ちフレーム数を指定したら動かせます。

・・・やったら解ると思いますが、上下に動くだけのどうでも良い機能に長い説明をしました。

 

[Auto再生中な事が一目で解る様にしたい]

これはジャム中に思っても何故か機能とも直そうともしなかった機能です。(やれば簡単だったのでやればよかった・・・)

実装が楽だったと言う理由で、今回はAuto再生中とおまけでSkip中は文字が赤くなるように弄ってみました。

blg7Autoの部分が赤くなっています

さっそく実装を紹介します。今回はAutoボタンとSkipボタン両方に適応させる為、ボタンの色を変える為の基礎クラスを作成します。

やる事はAwake時と選択時に現在の設定(onかoff)によって文字の色を変えるだけです。この基礎クラスにおいては今の状態を確認する処理をabstractメソッドにし、各ボタン用クラスで別途確認するようにしています。

 

またまた面倒なので全乗せ


using UnityEngine;
using System.Collections;
using Utage;

public abstract class IGameButtonExtension 
    : MonoBehaviour 
{
    public AdvEngine Engine { get { return this.m_engine ?? (this.m_engine = FindObjectOfType<AdvEngine>()); } }

    [SerializeField]
    AdvEngine m_engine;

    [SerializeField]
    protected Color m_normalColour = Color.white;

    [SerializeField]
    protected Color m_onColour = Color.red;

    [SerializeField]
    protected UnityEngine.UI.Text m_text;

    void Awake()
    {
        SetupColour();
    }

    public void OnTap()
    {
        SetupColour();
    }

    protected abstract bool IsTurnedOn();

    protected virtual void SetupColour()
    {
        if (IsTurnedOn())
        {
            m_text.color = m_onColour;
        }
        else
        {
            m_text.color = m_normalColour;
        }
    }
}

 

このスクリプトはボタン自体に設定しますので、文字のゲームオブジェクトのコンポーネントへの参照も入れる様にしています。オブジェクト自体は子供として有るので(GetChild()でも可能です)。

 

次にこれを各ボタン用に継承したクラスを作成します。ゲームの設定はAdvEngineのConfigの中に入っていますので、そこを参照しています。

 

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

public class AutoButtonExtension 
    : IGameButtonExtension 
{
    protected override bool IsTurnedOn()
    {
        return Engine.Config.IsAutoBrPage;
    }
}

 

これで準備出来ましたので、Autoのボタンにアタッチします。アタッチした後はAdvEnginとボタンの子オブジェクトへの参照を設定し、ボタンのクリック時の処理(OnClick)に新しいイベントを追加し、上記で実装したOnTap()を指定してください。

 

blg8

 

これでAutoは出来ましたので、次はSkipボタンを実装します。

 

using UnityEngine;
using System.Collections;

public class SkipButtonExtension
    : IGameButtonExtension
{
    protected override bool IsTurnedOn()
    {
        return Engine.Config.IsSkip;
    }
}

 

そしてこれもアタッチして、Autoと同じ設定をします。

blg9

これで実装完了です。ボタンを押せば色が変わる様になります。

 

[Skip, Auto等のボタンの表示をon/off切り替えたい]

宴のゲームはデフォルトでボタンが全部表示されており、正直Autoで読み進めて居る時は邪魔に感じます。

なので、押すと表示/非表示を切り替えられるボタンを追加してみました。

blg10「Log」ボタンの隣に「Menu」ボタンが追加されました

 

blg11押したら消えてスッキリ!

実装自体は単純で、現在の表示状態を保持し(開始時はOn)、ボタンを押した時は設定を切り替え、それに合わせてボタンのオブジェクトをアクティブ/非アクティブにしているだけです。

今回はボタンの親への参照を保持し、各ボタンの設定を切り替えています。

using UnityEngine;
using System.Collections;

public class MenuEnableButton 
    : MonoBehaviour 
{
    [SerializeField]
    RectTransform m_menuParent; // 各ボタンを保持している親オブジェクト

    bool m_isEnabled = true;

    public void OnTap()
    {
        m_isEnabled = !m_isEnabled;
        m_menuParent.gameObject.SetActive(m_isEnabled);

        int childCount = m_menuParent.childCount;
        for ( int i = 0; i < childCount; ++i )
        {
            m_menuParent.GetChild(i).gameObject.SetActive( m_isEnabled );
        }
    }
}

 

スクリプトの準備が出来ましたので、ボタンの準備をします。 ボタンは取り合えずLogボタンをCtrtl+Dで複製し、名前と文字を変えます。

その後にスクリプトアタッチし、Autoボタンの時にも行ったOnClickへのイベント指定処理を行います。ここで気をつけるのは、Logボタンで既に一つ入っていますが残ったままだと押した時にログが出ますので、ここの中身を空にしてください。

 

blg12

設定が多いですが、これで終わりです。

 

[選択肢の位置を動かしたい]

選択肢の位置がデフォルトでは一番上から順番に配置されるので、自分たちのゲームでは調度キャラの顔に被ってました。

なので、位置を取り合えず調整出来る方法を紹介します。

 

blg13彩夏ちゃんのかわいい顔が見えないでござるぅぅぅ!!!

 

blg14見える、見えるぞ!

 

正式な方法があるのかも知れませんが、今回やったのは、インスペクター上で開始位置とボタン毎のスペースを変更しました。

 

blg15デフォルト値

「Space」がボタン毎のスペース、「Padding to Top」が最初のボタンから画面の一番上までのスペースを表していると思われます。

なので、今回はSpaceを40, Padding to Top を 160にしました。

ただ、これは選択肢全体に影響を与える為、ちゃんとしたゲームを作る場合は他の方法を探した方が安全な気がします・・・

 

以上です。宴ネタはまた何かあったら書きます。

ノベじゃむで提出したexeをこのバージョンに差し替えたい・・・

 

久々のブログ更新です。生きてます、多分。

今週末はノベじゃむと言うUnity + 宴でノベルゲームを作るゲームジャムに参加してきました。

今回は去年にもジャムが行われた秋葉原のクラークさん(高校)で開催された為、チームに高校生の絵描きさんが参加してくれました~。

 

「ヒミツのおまじない」と言う、学園、幼馴染、恋愛/ラブコメ、と言うコテコテというか、べたべたなゲームを作りました

blg1

 

宴をがっつり使った事無かったので、当たり前の事でも少し詰まる所が有ったのでメモとして書いておきます(簡単な事が多いです)。

ちゃんと書くのが面倒なのと、会場に宴の開発者であるマッドネスラボの時村さんがいましたので、実際に聞いたり、聞いていなかったりする質問でQA形式で書いて行きます。

 

Q. 宴に特定のラベルまで飛ぶデバッグ機能はありませんか?
A. ありません。手軽に出来る方法としましては、ゲーム開始時に各ラベルへ飛ぶ選択肢を出す事です。

これ実際やりましたが、便利でした。ただ、数が増えると画面に収まらないので、気をつけてください。

 

blg3(裏技っぽい?)

 

Q. 複数のエクセルファイルを使用した時に、別のファイルに設定したラベルに飛ぼうとするエラーが・・・

A. テキスト用のシート名とラベル名が被っているとエラーが起こります
エクセルのシート名自体がラベル扱いされる作りになっているみたいなので、分ける必要が無ければラベルを新たに設定せず、シート名をそのまま指定すればそのシートの一番上から始まります。
ラベルを分けたい場合は通常通り名前が被らない様に別々の名前を設定すれば大丈夫です。

 

Q. Shakeをキャラのセリフを同時に出す事は出来ますか?

A. 出来ます。

Arg6のWaitTypeにPageWaitを指定し、その後にキャラのセリフを書けば実装できます。

詳しくはShakeコマンドのレファレンスで。

blg0(はい、エロ本と書いてあります。)

 

Q. パーティクル出したい

A. 出せば?

えー、はい。ドキュメントには書いていないのですが、出す事自体は可能でした。

宴には3Dモデルのキャラを出す機能がありますが、方法の一つとしてプレハブを指定する方法がドキュメント有りましたので、エフェクトのプレハブを立ち絵と同じのResources/Texture/Character内に保存し、後は3Dモデル読み込みと同じ手順で再現出来ました。

ただ、読み込み先ファイル指定の時に拡張子に「.prefab」を付けないとエラーが出るのでお気をつけください。

blg2光ってます

 

Q. フラグやパラメーターをゲーム画面から弄るデバッグ機能はありますか?

A. ありません。(以前は有ったらしいです)

あったら人によっては嬉しそうですよね。

 

Q. 時村先生・・・テキストを・・・動かしたいです・・・!

A. 諦めたらそこで試合終了だよ(役:機能としては出来ません)

宴の機能としてテキストを動かす事は出来ません。ですが、同じ効果は文字を書いた画像を使えば実現可能なので、メモリーがある限りは諦めちゃだめです!

今回はスタッフロールを作る時に文字を動かしたかったのですが、画像を使って実現しました。

 

blg4最初の方
blg5動いた後

 

ちなみに動かすのはSpriteにTweenを使用しています。

 

今回は以上になります。

また何か思いついたら追加します。

ノベルゲームは遊ぶ方も作る方も詳しくないですが、今回は良い物が出来て、作るのも楽しめたので、関係者の皆さんありがとうございました

m_ _m

[更新]
複数のエクセル + ラベル名について追記しました。