AnyPortrait > マニュアル > 風の効果を実装
簡単なスクリプトで物理モディファイヤやジグルボーンが適用されたキャラクターに物理的な効果を加えることができます。
このページでは、キャラクターが特定の領域に入ると、風が吹く効果を実装する方法を説明します。
このページの説明に基づいて、皆さんのプロジェクトでは、より多様な方法で物理的効果を作成しよう!
下のページを一緒に参照してくださいに役立ちます。
- 物理効果
- Getting Started 1.9. 物理効果の追加
- 物理モディファイヤ
- ジグルボーン
上記のようにシーンを設定します。
キャラクターと二つの領域で構成されています。
(1) 二つの領域の名前は、「WindArea_Left」と「WindArea_Up」です。
キャラクターがこの領域に入ると、それぞれ左と上に風が吹くことです。
(2) 領域のいずれかを選択します。
(3) 「Box Collider 2D」コンポーネントを追加します。
(4) 「Is Trigger」属性を有効にします。
他の領域も同様に、コンポーネントを追加して設定します。
物理的な効果は、「物理モディファイア」や「ジグルボーン」に適用されます。
「物理モディファイヤ」を追加して、物理材質をメッシュに適用します。
「ジグルボーン」を利用して、物理的な効果を持つように作成することもできます。
下のスクリプトを作成して、キャラクターが「Trigger」の中に入ると、風が適用されるように実装してみましょう。
using UnityEngine;
using AnyPortrait;
public class WindSampleScript : MonoBehaviour
{
private apPortrait portrait;
private apForceUnit forceLeft = null;
private apForceUnit forceUp = null;
void Start()
{
portrait = GetComponent
}
private void OnTriggerEnter2D(Collider2D collision)
{
//キャラクターが「Left」との文字が名前に含まれている領域に入った場合
if(collision.gameObject.name.Contains("Left"))
{
//すでに力が生成されている場合削除します。
if (forceLeft != null)
{
portrait.RemoveForce(forceLeft);
}
//左(-1、0)方向に継続して(Loop)力が適用されます。
forceLeft = portrait.AddForce_Direction(new Vector2(-1, 0)).SetPower(5000.0f);
forceLeft.EmitLoop();
}
//キャラクターが「Up」との文字が名前に含まれている領域に入った場合
if(collision.gameObject.name.Contains("Up"))
{
//すでに力が生成されている場合削除します。
if(forceUp != null)
{
portrait.RemoveForce(forceUp);
}
//上部(0、1)の方向に継続して(Loop)力が適用されます。
forceUp = portrait.AddForce_Direction(new Vector2(0, 1)).SetPower(5000.0f);
forceUp.EmitLoop();
}
}
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.name.Contains("Left"))
{
if (forceLeft != null)
{
portrait.RemoveForce(forceLeft);
forceLeft = null;
}
}
if (collision.gameObject.name.Contains("Up"))
{
if (forceUp != null)
{
portrait.RemoveForce(forceUp);
forceUp = null;
}
}
}
}
- 「OnTriggerEnter2D」、「OnTriggerExit2D」イベントは「Is Trigger」が設定されたColliderに文字が入ったり出る呼び出されます。この時、Colliderの名前を利用して、「Left」領域なのか「Up」領域なのか区分しました。
- 「AddForce_Direction」関数は、直線方向の力を加える関数です。この関数は、「SetPower」と「EmitLoop」または「EmitOnce」関数と一緒に呼び出す必要があり動作します。
- 「AddForce_Direction」で生成される「apForceUnit」を利用して、「左の風」と「上の風」を区分し、「RemoveForce」関数呼び出し時に利用しました。
(1) キャラクターを選択します。
(2) キャラクターの上に作成したスクリプトを追加します。
キャラクターが「Box Collider2D」の中に入ることを認識するColliderと「Rigidbody 2D」コンポーネントが必要です。
(3) ここでキャラクターの形に合わせて、「Capsule Collider 2D」を追加し、サイズと位置を設定します。
(4) 「Rigidbody 2D」を追加します。
この状態では、物理エンジンによってキャラクターが下に落ちることです。
「Rigidbody2D」のプロパティの、「Constraint > Freeze Position > Y」をチェックして落ちるのを防ぐことができます。
ゲームを実行してみましょう。
領域外にある場合キャラクターに風が吹かない。
キャラクターが最初の領域に入ると、風が左に吹くことを見ることができます。
「OnTriggerEnter2D」イベントが発生して、「AddForce_Direction」関数が呼び出されたためです。
キャラクターが第2の領域に入ると、風が上向きに吹くことを見ることができます。
またキャラクターが領域外に出ると、すべての力が消えます。
「OnTriggerExit2D」イベントが発生して、「RemoveForce」関数が呼び出されたためです。