最近作ったティラノスクリプトのプラグインとマクロ

はじめに

最近頼まれて作ったティラノスクリプトのプラグインとマクロたちをまとめました。
限定的な用途のものも結構あります。
ティラノスクリプト バージョン471bで動作を確認しています。

自動的に喋っているキャラが前面に来るプラグイン

chara_configタグを使うと喋っているキャラの明るさを変えるような演出はできます。
それに加えて、喋っているキャラを前面にする機能を追加します。
喋っているキャラのz-indexをキャラ内で最大にします。

ダウンロードはこちら
targetFocusZIndexというフォルダが自動的に喋っているキャラが前面に来るプラグインです。

導入するだけで機能は有効になりますが、On、Offする機能があります。
・OFFにしたいとき
[offTargetFocusZIndex]

・OFFからONにしたいとき
[onTargetFocusZIndex]

アニメーション待ちのカウントを0にしてフリーズを抑止するマクロ

前にアニメーション待ちのwaタグでフリーズするケースで説明しました。
waタグはアニメーションしている数が0になるまで待つタグですが、そのアニメーションしている数が0にならないケースが存在し、フリーズします。
そこで、強制的にこの数を0にするのがこのマクロです。
シーンの遷移時に呼ぶことによって、アニメーションが完了しない不慮の事態を別のシーンに持ち越すことがなくなります。

1
2
3
[macro name="clearAnimCount"]
[eval exp="TYRANO.kag.tmp.num_anim=0"]
[endmacro]

cmだとbuttonが全て消えてしまうので、一部だけ消すマクロ

buttonタグはすべてフリーレイヤーに配置され、cmタグを呼ぶことによって消去されます。
しかし、一部のボタンだけ消したいケースがあったため、buttonタグのnameを指定してbuttonを消すマクロを用意しました。

1
2
3
4
5
6
7
8
9
10
[macro name="cfl"]
[iscript]
var fl = TYRANO.kag.layer.getFreeLayer();
if(mp.include) {
fl.find("." + mp.include).remove();
}else if(mp.exclude){
fl.find(":not(." + mp.exclude + ")").remove();
}
[endscript]
[endmacro]

例えば、以下のようなbuttonタグがあったとき、group1のボタンだけ消したい場合は、
[cfl include="group1"] とします。
逆にgroup1以外を消したい場合は、
[cfl exclude="group1"] とします。

1
2
3
4
[button graphic="button1.png" x="100" y="100"  target="t1" name="btn1,group1"]
[button graphic="button1.png" x="100" y="200" target="t2" name="btn2,group1"]
[button graphic="button1.png" x="100" y="300" target="t3" name="btn3,group2"]
[button graphic="button1.png" x="100" y="400" target="t4" name="btn4,group2"]

キャラのz-indexを変えるマクロ

chara_showでキャラを登場時にz-indexを指定することはできますが、途中で変えたいという要望に対応したマクロです。

1
2
3
4
5
6
7
[macro name="charaZIndex"]
[iscript]
if(mp.name && mp.z){
$("." + mp.name).css('z-index', mp.z);
}
[endscript]
[endmacro]

マクロは以下のように使います。
[charaZIndex name="akane" z=10]

buttonホバー時にx,y座標を変えるプラグイン

buttonタグのホバー時にx,y座標を変更するプラグインです。
buttonタグのパラメータに enterimgXとenterimgYを追加。
座標は現在座標からの相対位置になります。

使用例:
[button x=100 y=150 graphic="button1.png" target="gamestart" enterimg="button2.png" enterimgX="-20" enterimgY="-10"]

ダウンロードはこちら
enterimgExtensionというフォルダがbuttonホバー時にx,y座標を変えるプラグインです。

すべてのボタンのクリックを抑止するプラグイン

画面に透明な壁を作り、ボタンなどのクリックを吸収し、すべてのボタンに対するクリックを無効にします。

[preventClick] で発動し、[preventClick off=true] で解除です。

ダウンロードはこちら
preventClickというフォルダがすべてのボタンのクリックを抑止するプラグインです。

ボタンクリック時にウェイトを挟むので、その間ボタンを連打できなくするプラグイン

ボタンをクリックしてすぐに遷移するのではなく、アニメーションをしてから遷移したいというニーズに対応したときに作ったプラグイン。
以下のようにアニメーションしてウェイト挟んでからjumpするようなイメージ。
この場合、ウェイト中にボタンをクリックすると何度もイベントが発行されてしまい困るということです。

1
2
3
[anim name="anim" left="+=300" opacity="255" effect="jswing" time=1000]
[wait time=1000]
[jump storage=scene.ks]

waitと同じ機能でbuttonタグのクリックを無効にするwaitNoClickタグを追加しました。
ただし、role指定のbuttonには対応していません。

1
2
3
[anim name="anim" left="+=300" opacity="255" effect="jswing" time=1000]
[waitNoClick time=1000]
[jump storage=scene.ks]

ダウンロードはこちら
waitNoClickというフォルダがウェイト中にボタンを連打できなくするプラグインです。

ライセンス

完全に自由にどうぞ。
クレジットの表記もいりません。

Vectrosityを使ってUGUI上で線や円のアニメーションをする

Vectrosity

アセットストアで販売されているVectrosity - Asset Storeを使うと、UGUI上に線や円といった図形を描画することができます。
今回はVectrosityを使ってアニメーションを作成します。
例えば、以下のように円の大きさを変えてみたり、

Sound

線の終点を変えてレーダーのような表現といったことができます。

レーダー

ちなみにUGUI上に線や円を描くのに「uGUI でプリミティブな図形を描画できる「UIGraphicAPI」紹介」にあるようにGithubで公開されているものもあります。最初これを使っていたのですが、アニメーションしようとするとパフォーマンスがすごい落ちるのでVectrosityに変えました。

Vectrosityのオブジェクトを作る

アセットをインポートしたら、Create->UI->VectorLineでオブジェクトを作成できます。

UI VectorLine

作成するとCanvasが作られ、中にLineオブジェクトが作られます。Canvasは普通のUGUIのCanvasなのでここで重要なのはLineの方です。

VectorCanvas

LineオブジェクトにはVectorObject2Dコンポーネントがついていて、これをいじって線にしたり円にしたりアニメーションしたりします。スクリプト側からいじりますが、線の太さや色などデフォルトで決めておきたい場合は設定しておいても良いです。

VectorObject2D

円のアニメーション

小さい円からだんだん大きくなる円をつくります。
以下のソースコードで示すとおりです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System.Collections.Generic;
using UnityEngine;
using Vectrosity;

public class MakeCircle : MonoBehaviour {

VectorObject2D line;

void Start() {
var points = new List<Vector2>();
//20は円の頂点の数。多くすればよりなめらかになる。
//ここでは位置を考えずに頂点を作成するだけ。
for (var i = 0; i < 20; i++) {
points.Add(Vector2.zero);
}
line = GetComponent<VectorObject2D>();
//VectorObject2d.vectorLineが線の情報を持つ本体。頂点情報をここで代入
line.vectorLine.points2 = points;
}

void Update() {
//MakeCircleの引数は、原点、半径、頂点数。頂点数は上で作成した数-1を指定する
line.vectorLine.MakeCircle(Vector3.zero, Time.time * 10, line.vectorLine.points2.Count - 1);
//再描画
line.vectorLine.Draw();
}
}

線のアニメーション

線に関しては頂点の位置を自由に変えればいいだけなので、特に書くことはない。
デフォルトで頂点は2つ作られているので以下のようにすれば線は引ける。

1
2
3
lLine.vectorLine.points2[0] = new Vector2(0, 0);
line.vectorLine.points2[1] = new Vector2(100, 100);
line.vectorLine.Draw();

プラグインの使用状況を出すプラグイン

概要

pluginsフォルダに入っているプラグインの使用状況を以下のように出力します。

  1. 「プラグイン管理」に登録してないONでもOFFでもない、pluginsフォルダに入っているだけのプラグイン
  2. ON状態のプラグイン
  3. OFF状態のプラグイン

使用状況

ダウンロード

動作バージョン: RPGツクールMV1.6以上

こちら

導入して起動するとコンソールに出力されます。

ライセンス

完全に自由にどうぞ。
クレジットの表記もいりません。

装備を記憶、ロードするプラグイン

概要

アクターの装備を一度記憶し、それをロードできるプラグインを作りました。
使用例としては、着せ替えゲームを作ったときにコーディネートを複数保存するということができます。
あるいは敵に装備を奪われ、取り返したときに復元するみたいなこともできます。

仕様

変数の管理みたいに保存領域を用意します。
例えば、1番にはアクター1の装備を保存、2番にはアクター3の装備を保存ということができます。
記憶したアクター1の装備をアクター3にロードするということができるようにします。
ロード時に所持品に該当装備があれば装備し、ない場合は装備なし状態になります。
ただし、パーティにそれを装備しているアクターがいた場合、それを奪うかどうか設定できます。
当然、アクター1の装備をアクター3にロードしたとき、装備できない装備は装備されません。
ゲームのセーブ・ロードに対応。

プラグインコマンド

記憶

  • SaveEquips arg0 arg1

    arg0はアクター番号、arg1は保存先番号
    例: SaveEquips 1 1
    引数には変数の制御文字が使えます。
    例: SaveEquips \V[3] \V[4]

ロード

  • LoadEquips arg0 arg1 arg2

    arg0はアクター番号、arg1は保存元番号、arg2は所持品に装備がない場合にパーティの装備を奪うか(0か指定なしは奪わない、1は奪う)
    例: LoadEquips 1 1
    例: LoadEquips 1 1 1
    引数には変数の制御文字が使えます。
    例: LoadEquips \V[3] \V[4]

ダウンロード

RPGツクールMV1.6以上にのみ対応。1.5は対応していません。

こちら

ライセンス

完全に自由にどうぞ。
クレジットの表記もいりません。

アニメーション待ちのwaタグでフリーズするケース

はじめに

ティラノスクリプト ver471 の話です。

先日、アニメーション中にフリーズすることがあるという話があり、調査しました。
その結果、アニメーション待ちをするwaタグでフリーズしていました。

ティラノスクリプトのanimタグの動作は以下のようになっています。

  • アニメーション開始で 現在アニメーションしている数が +1
  • アニメーション完了で 現在アニメーションしている数が -1

waタグは「現在アニメーションしている数が 0 になるまで待つ」というタグなのですが、アニメーション完了が呼ばれないケースがあり、現在アニメーションしている数が一生 0 にならないことがあります。

そのため、waタグの待ちがずっと続いてしまい、フリーズしてしまうという現象がおきます。

フリーズした場合、ティラノライダーで確認してもwaコマンド移行が実行されていません。
waタグでストップしている

ケース1

キャラが2人以上表示されており、一人がアニメーションしていなくて、片方がアニメーションしているときに、chara_hide_allをした場合です。
例を下に示します。

1
2
3
4
5
6
[chara_show  name="akane" ]
[chara_show name="yamato" ]
[anim name=akane left="-=30" time=1000 effect=jswing]
[anim name=akane left="+=30" time=1000 effect=jswing]
[chara_hide_all time="0"]
[wa]

ケース2

アニメーション中にfreeimageしても同様にフリーズします。

1
2
3
4
5
[chara_show  name="akane" ]
[anim name=akane left="-=30" time=1000 effect=jswing]
[anim name=akane left="+=30" time=1000 effect=jswing]
[freeimage layer=0]
[wa]

簡単な説明

簡単に言うと、chara_hide_allfreeimageもアニメーション中の対象を削除します。削除するのでアニメーション完了が呼ばれません(chara_hide_allに関してはもう少し特殊ですが)。

現状とれる対処

chara_hide_allfreeimageの前でwaを呼び、アニメーション完了を待ってから消す。