読者です 読者をやめる 読者になる 読者になる

【ジョーカースクリプト勉強会】揺らしエフェクト編【第3回】

Unity その他 ジョーカースクリプト

お久しぶりです、ふくともです。

先日ブログ名を変更してみました。

 

何か意味があるわけではないのですが、以前のタイトルだとちょっと硬いかなぁ、と思ったのでキャッチーと言うかなんというか、ゆるーくしてみようかと思った次第です。

 

もし個人サークルで技術本作ったりするとしたらサークル名もこれにしましょうかね

 

友人に連絡中に予測変換でドラッグ・アンド・ドロップがドラッグ・アンド・ドロップキックになってしまって語感が気に入っただけで深い意味はこれっぽっちもありません(笑)

 

さて、久々の更新となったわけですが、自分が所属しているサークルがコミックマーケットに出展したわけでして、その締め切りに追われて更新する暇がなかったのです。

その間に学んだこと/覚えたことは色々あるものの、発信できていなかったのでその分をこれから発信できればなぁ、と思います。

 

改良版の記事はこちら

 

......で、今回は前回少しだけお話した自作プラグインについて書かせていただきます。

 

 モノ自体は非常にシンプルな揺らしエフェクトです。

作成した経緯ですが、

自サークルが作った作品は当初、吉里吉里2/KAG3を利用していたためこのような揺らしタグが標準搭載されていたわけですが、ジョーカースクリプトには非実装でした。

 

しかし、この揺らしがないとインパクトに欠けるから揺らさないわけにはいかない!!

ならば自作しよう(というか自作せざるを得ない)ということで作ってみたわけです。

 

......といってもジョーカースクリプトはテキストノベル作成のためのアセットなのでそれ単体では実装できない(or実装が難しい)と考えたため他の画面エフェクトができそうなライブラリを探し、ジョーカースクリプトプラグインとして組み込むことに。

 

僕が持っている唯一のUnity資料

www.amazon.co.jp

何かないかなぁ、と読み漁ってみると

iTweenなるものがあるらしい。(最初iTunesと読み間違えたのは秘密)

使い方はこちらのWikiを参考にするといいと思う。

日本語での解説とサンプルコードが掲載してあるので非常にわかりやすかった。

導入についてはwikiの方で十分解説してあったため割愛。 

 

本の中では「ダメージエフェクトでキャラクターを揺らしたい」というシチュエーションで利用されている。

 

この対象を「キャラクター」ではなく「画面全体」にしたら実装できるのではないかと考えた。

 

現在位置からの移動
// このコードを適用したgameObjectを5秒掛けて(3, 3, 3)の位置まで移動させる
iTween.MoveTo(gameObject, new Vector3(3, 3, 3), 5.0f);
 
第一引数に移動させたいGameObjectを指定、
第二引数に移動させたい位置をVector3で指定、
第三引数に移動させる時間をfloatで指定します。
 
ハッシュテーブル
Hashtable table = new Hashtable();		// ハッシュテーブルを用意
 
private void Start()
{
	table.Add("x", 10);			// xを10まで移動
	table.Add("y", 5);			// yを5まで移動
	table.Add("time", 3.0f);		// トゥイーン時間は3秒
	table.Add("delay", 1.0f);		// 1秒遅らせてからトゥイーンスタート
	iTween.MoveTo(gameObject, table);	// 第二引数にハッシュテーブルをセット
}
 
ハッシュテーブルを使用したトゥイーン方法です。


iTween.MoveTo(gameObject, iTween.Hash("x", 10, "y", 5, "time", 3.0f, "delay", 1.0f));
 
iTween.Hash("プロパティ", 値, "プロパティ", 値, ...)
と続けて一行で書くことも出来ます。
 
揺らす
private void Start()
{
	// 現在位置からx:-20までランダムに揺れる
	iTween.ShakePosition(gameObject, iTween.Hash("x", -20));
	// 現在角度からy軸260度までランダムに回転する
	iTween.ShakeRotation(gameObject, iTween.Hash("y", 260));
	// 現在スケールからz軸を10倍にしたサイズまでランダムに拡大縮小する
	iTween.ShakeScale(gameObject, iTween.Hash("z", 10));
}
private void Start()
{
	// Vector3.one * 10(Vector3(10, 10, 10))を指定しているので、xyz方向に大きく揺れる
	// "z", 1はおそらくVector3(0, 0, 1)なので、amountのVector3に効果が上書きされている模様
	iTween.ShakeScale(gameObject, iTween.Hash("z", 1, "amount", Vector3.one * 10));
}
amountで揺れる大きさをVector3オブジェクトで指定します。
 
wikiによると、この第一引数のgameObjectがエフェクトの対象らしい。
ということは、ここに「画面」を指定すればよいのではなかろうか。
 
そのためには「画面」にあたるGameObject名を取得しなければならない。

 

albatrus.com

GameObject.Find

まずは、オブジェクトの「名前」からアクセスをする方法です。

2014-6-19-fdsasa

 どうやらオブジェクト名はここから分かりそうだ。

 

自分の環境を見てみると、

f:id:q-fukutomo:20150818184638j:plain

この「MainCamera」 というのが「画面」に当たりそうである。(そして実際にこれで合っていた)

 

オブジェクト名はわかったものの、この先どう扱えばいいのか

とりあえずゲームオブジェクトに関する資料をもう少し探す。

 

すると、いかにもなページを発見。

qiita.com

Find()でゲームオブジェクトを取得しよう

Find()を用いることで"ゲームオブジェクト名"から
ゲームオブジェクトを取得できます。

適当なPlaneを作ったとします。

//適当なGameObject型の変数 gを作成
    public GameObject  g;
        void Start () {

//g に最初に見つかった名前が Plane のゲームオブジェクトを取得する
        g = GameObject.Find("Plane");

        print ( g );
        print ( g.audio);
//出力 Plane
//出力 null
}

なるほど。

ということは、

GameObject.Find("MainCamera");

で画面のオブジェクトを取得できるわけだ。

 

ここまで分かれば何となく行けそうな気がする。

プラグイン作成に関しては前に書いた記事ジョーカースクリプト公式のプラグイン作成解説ページを参照。

 

以下コード。

QuakePluginComponent.cs

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

namespace Novel{
    public class QuakeComponent:AbstractComponent{
        public QuakeComponent(){}
        GameObject target = GameObject.Find("MainCamera");
        public override void start(){
            iTween.ShakePosition(target, iTween.Hash("x",1.5, "y",1.5, "time",5.0f));
            this.gameManager.nextOrder();
        }
    }
}

 

これで縦横に画面が5.0秒間揺れる[quake]タグが作れました。

 

ダウンロードはGitHubからどうぞ。

github.com

 

揺れ幅や時間が固定だから、タグ呼び出し時に値を指定できるようにするともっと使い勝手がいいのかなぁ、と思いつつ実装方を考える余裕が時間/精神どちらも無かったから断念した。

 

これを叩き台に誰かがいじってくれたらとても嬉しい(自分でやれって話ではあるけども。)

とりあえず今回はここまで。

 

少し話は戻りますが、私が所属しているサークルを少し紹介させていただきます。

サークル名:outer(base);

活動ジャンル:ノベルゲーム制作(オリジナル)

メンバー

HP:http://outer-base.mydns.jp/

【ジョーカースクリプト勉強会】背景編【第2回】

ジョーカースクリプト Unity

また更新の間が開いてしまいました、ふくともです。

キャラクタ画像はまた別の回で解説させていただきます。

 

今回は背景について。

以下関連タグ

  • 背景作成:[bg_new storage="BACKGROUND_IMAGE"]
  • 背景切替:[bg_mod storage="BACKGROUND_IMAGE" time=N]
    BACKGROUND_IMAGEは使用する画像ファイルで、プロジェクト内の
    Assets/JOKER_GAME/Resources/novel/data/images/background/
    ディレクトリから選択(このディレクトリまでのパスは記述しない)、拡張子は省略可能です。
    time=NはN秒かけて切替えます。
  • 背景削除:[bg_remove]
  • 背景表示:[bg_show]
  • 背景非表示:[bg_hide]

 

基本的な流れとしては

 

[bg_new storage="BACKGROUND_IMAGE1"]

[bg_show]

〜テキスト等を記述〜

[bg_mod storage="BACKGROUND_IMAGE2"]

〜テキスト等を記述〜

[bg_mod storage="BACKGROUND_IMAGE3"]

 

と記述していき背景が不要になったところで

 

〜テキスト等を記述〜

[bg_hide]

[bg_remove]

 

と削除してあげれば良いです。

 

 次回は画面全体を対象とするエフェクトプラグイン(自作)について書きたかったのでキャラクタ画像や音声より先にこちらを記事にしました。

自分としては割と便利なプラグインだと思うので期待していただけると幸いです。

2015/07/11 Sun.

【ジョーカースクリプト勉強会】ゲーム終了編【第1.5回】

ジョーカースクリプト Unity

ご無沙汰してます、旧:ふくともです。

試験間近であまり余裕が無いので簡単に済まさせていただきます。

 

現在利用させて頂いているジョーカースクリプトですが、Unityのアセットのひとつでありゲームエンジンそのものとは異なるためゲームの起動や終了機能は組み込まれていません。

 

起動に関してはUnityからジョーカースクリプトが呼ばれるため問題無いですが、逆に終了する際にはジョーカースクリプト側からUnityに閉じるように指示を出さなければいけません。

 

なので、それを実行する最もシンプル(と思われる)終了タグを実装するプラグインを組んでみました。

 

このタグに到達したらそこでアプリケーションを終了させるだけで、確認ダイアログや自動セーブ機能などは何もありません。

叩き台程度に考えていただけるとよろしいかと思います。

 

以下コード

 

// [exit]でゲームを終了させるプラグイン

 

using UnityEngine;

using System.Collections;

using System.Collections.Generic;

 

namespace Novel{

    public class ExitComponent:AbstractComponent{

        public ExitComponent( ){ }

        public override void start( ){

            Application.Quit( );

        }

    }

}

 

このコードを

Assets/JOKER_GAME/Plugins/PluginComponent.csの中に貼り付けて

シナリオファイルの中で[exit]または@exitと記述していただければそこでゲームが終了するようになります。

 

このコードではマズい、機能追加してみた、などございましたら連絡いただけると幸いです。

2015/07/02 Thu.

 

追記

Assets/JOKER_GAME/Plugins/PluginComponent.csにコードを貼り付けずに

Assets/JOKER_GAME/Plugins/ExitPluginComponent.csというファイルを作成し、その中にこのコードを記述しても問題なく動くようです。

 

どのファイルがどのプラグインのものなのかわかるように、ファイルを分割したほうがメンテナンス性も上がっていいかもしれません。

2015/07/06 Mon.

【ジョーカースクリプト勉強会】テキスト編【第1回】

ジョーカースクリプト Unity

KAGスクリプトを使ったことがあると非常にやりやすいですね

導入法については公式さんを見ていただいたほうが早いかと。

jokerscript.jp

 

  • 表示テキスト(シナリオの文章そのもの、デフォルトで1行当たり全角31字まで)
  • ラベル(シナリオの繋ぎに関わるもの、内容自体は非常に簡単)
  • タグ(クリックを待たせる、改行を行う、別のシナリオへ飛ぶ、などといった処理の部分、コレが肝)

 の3つを押さえれば作れると思います(暴論)

画像や音声とかのリソース系のタグについてはまた別記事で書こうと思います。

 

ラベルの表記法

*LABEL

ラベル名の前に*を付けるだけ。

この例だとLABELというラベルが出来ます。

ラベルについてはこれだけ。

 

 

タグの表記方

  1. [TAG]
  2. @TAG

ex.) [l]と@lは同じ挙動をする

注意. @TAGで書く場合は一行で収める必要あり

例えば

  • [wait
    time=3]
  • @wait
    time=3

前者はOK、後者はNGということ

 

主要タグ一覧

  • クリック待ち:[l]
  • 改行:[r]
  • 改ページ(クリック待ち含む):[p]
    ※[l][p]と記述すると改ページまでに二回クリックが必要になります。
  • N秒待ち:[wait time=N]
  • 別のシナリオへ飛ぶ:[jump file="SCENARIOFILE" target=LABEL] 

 

jumpタグの引数について

引数が色々あって他のタグに比べやや複雑なので解説を。

  • file=SCENARIOFILE:SCENARIOFILEというファイルに飛ぶ、シナリオファイルを分割する際に有用。
  • wide(またはtall)ディレクトリから指定する。
    指定しなければ現在のファイルと同じファイルを指定したことになる。
  • target=LABEL:指定ファイル内のLABELというラベルに飛ぶ指定しなければそのファイルの先頭に飛ぶ。
  • scene=new:new を指定すると新しくシーンを作成した上でジャンプします。
    ※シーンとは:表示している背景やキャラ情報などのこと、これを新規作成すると表示情報を一旦クリアできる。
  • index:正直自分もよくわからない
    こちらで質問中

たとえば

  1. 「サンプルテキスト」と表示して
  2. クリック待ち
  3. SCENARIO2のLABEL2に飛んで
  4. 「jump後」と表示

ということをしたい場合

 

SCENARIO1.txt

【前略】

サンプルテキスト[l]

@jump file="wide/SCENARIO2" target=*LABEL2

 

SCENARIO2.txt

*LABEL2

jump後[l]

【後略】

 とすればOKというわけです

 

これだけ覚えれば絵/音/エフェクト/分岐/タイトル画面無しの簡易ノベルゲーム(と呼べるかも怪しい物)が組めますね

 

これだけでは流石に寂しいのでまた次回は今回触れなかった辺りについて書いてみようと思います。

 

「間違ってるよ!!」とか「うまく動かねぇぞ(# ゚Д゚)ゴルァ!!」ということであればその旨のコメントをいただけると嬉しいです。

 

2015/05/29

 

なれる!SE 1巻読了。

その他

どうも、ふくともです。

 

元々興味はあった上に、知り合いにも勧められたので「なれる!SE」というライトノベルに手を出してみました。

ここにラノベの感想ってどうなんだ、とは思うもののエンジニア志望の身として中々に影響を受けそうだったので紹介してみようかと思ったわけです。

 

〜1巻あらすじ〜

・主人公(工兵)、就活難の足元を掬われブラックIT企業に就職

・上司(立華)にOJT(On the Job Trainingの略)を行ってもらう

・ネットワーク環境構築編(2巻以降では違うかもしれない、あくまで1巻では)

 

工兵:新卒、コミュ力だけが取り柄、IT業界とは無縁だった

立華:(見た目)中学生くらい、技術力は本物、ツナ缶、かわいい、無防備、コミュ力に欠ける、鬼教官

 

とまぁこんな感じ

他にも登場人物はいるけど割愛

 

読んでの感想(あくまで主観的に、です)

どう言っていいか難しいんだけど、生々しさとフィクションがすごく馴染んでて読みやすい。

更に専門用語とかを遠慮無く使ってはいるんだけど、主人公もそれらをほとんど知らないから一緒に勉強できる。

またエンジニアとしての心持ちであったりその醍醐味であったりにもスポットが当てられていて読んでいて引き込まれる。

 

すごく読みやすくて面白い、そしてタメになる

とてもいい教本だと思う

 

知識をつけてから読み返してみるとまた違った面白さがあるかもしれないなー、と思いました。

興味を持たれた方は是非、1巻だけでも読んでみることをお勧めします。

www.amazon.co.jp

以上。

 

2015/05/27

【告知】今後の方針

その他 HTML/CSS ジョーカースクリプト Bootstrap Unity

お久しぶりです。

ふくともです。

 

今回は今後どういった内容の記事を書くか告知してみようと思います。

 

・Bootstrapフレームワークを利用したHTMLコーディング

・Unityを利用したノベルゲーム制作

この2つがメインになってくるかと思います。

 

Bootstrap

とあるイベントのHP制作をやらせていただけることになったのですが、今まで通り0からコーディングすると手間が掛かりすぎるなぁ、と感じたためフレームワーク利用に手を出そうと思った次第です。

 

Unity / ジョーカースクリプト

自サークルでノベルゲームを制作中で、昨年の冬コミ(C87)で出典した体験版は吉里吉里2 / KAG3で制作を行ったのですが、「スマホとかにも移植したいよね」という話が上がったので対応プラットフォームの多いUnityを利用してみようかと思った次第です。

Unityは本来3Dグラフィックのゲーム制作向き(らしい)のですが、制作を行うのはノベルゲームのためUnityでのノベルゲーム製作キットであるジョーカースクリプトと併せて勉強しつつ記事を書いていこうと思います

 

その他には余裕があればSassについても記事を書いていけたらなぁ、と思います。

なるべく更新頻度を上げて同じものを勉強中の人の力になれたらいいなぁと思います。

 

以下案内

サークルHP

http://outer-base.mydns.jp/

サークルTwitter

outer(base);@夏コミ準備中 (@outer_base) | Twitter

HPを作らせていただくのイベント運営Twitter

「ユメノトビラ」準備会 (@yumetobijyunbi) | Twitter

ミナリンスキー準備会 (@mikage0506) | Twitter

 

2015/05/22

【C++】stringの関数による書き換えについて

C++

ふくともです。

C++でstringに格納した特定の文字だけを変換する、という処理を行おうとしたところコケたのでメモ的に書いておく

 

〜イメージ〜

hogehoge → 変換関数 →h0geh0ge

 

コード

#include <iostream>

#include <string>

using namespace std;

void leet(string, int);    // 変換関数

int main(){
    string str="hogehoge";
    leet(str, (int)str.size());
    cout << str << endl;
    return 0;
}

// 変換関数

void leet(string str, int size){

    for(int i=0;i<size;++i)

        if(str[i]=='o') str[i]='0';

    cout << str << endl;

    return;

};

 

コード自体はすごく簡単

stringオブジェクトと、その文字数(サイズ)を関数に渡す

→先頭から一文字ずつ調べて o があれば 0 に置き換える

 

で、実行結果......

hogehoge

......あれ?

変わってない

 

試験的に関数内部でも出力

#include <iostream>

#include <string>

using namespace std;

void leet(string, int);    // 変換関数

int main(){
    string str="hogehoge";
    leet(str, (int)str.size());
    cout << "main() : " << str << endl;
    return 0;
}

// 変換関数

void leet(string str, int size){

    for(int i=0;i<size;++i)

        if(str[i]=='o') str[i]='0';

    cout << "leet() : " << str << endl;

    return;

};

 

実行結果

leet() : h0geh0ge

main() : hogehoge

 

......書き換えはできてないけど、オブジェクトのコピーはされてるみたい

↓詳しくはここのローカルコピーについて読むといいかと。

qiita.com

 

ローカルコピーさせない、ってやり方もないことはないのかもしれないけどめんどくさそう結構な手間が掛かりそうだから別の方法を。

 

よくよく考えてみると、関数によってコピーされてるってことは関数が終了したらスコープの関係でコピー分のメモリは開放されるから元のオブジェクト直接書き換えなくてもいいよね

 

というわけで、書き換え後のstringオブジェクトを返して、それを元のオブジェクトに上書きしてみる

 

#include <iostream>

#include <string>

using namespace std;

string leet(string, int);    // 変換関数

int main(){
    string str="hogehoge";
    str = leet(str, (int)str.size());
    cout << "main() : " << str << endl;
    return 0;
}

// 変換関数

string leet(string str, int size){

    for(int i=0;i<size;++i)

        if(str[i]=='o') str[i]='0';

    cout << "leet() : " << str << endl;

    return str;

};

 

実行結果

leet() : h0geh0ge

main() : h0geh0ge

 

 

目標達成。

最後に試験的に書いてて必要なくなった部分をコメントアウトor削除したら終了。