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

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

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

 

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

 

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

 

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

 

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

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

 

改良版の記事はこちら

 

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

 

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

作成した経緯ですが、

自サークルが作った作品は当初、吉里吉里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/