📌

HeliScriptでアイテムをまっすぐ動かす【コピペで使えるサンプルコード付き】

2024/04/15に公開

はじめに

かなり前置きが長くなってしまいましたが、ここから実際にHeliScriptを書いて実行してみましょう!
本記事ではアイテムをまっすぐ動かすためのcomponentを作っていきます。このcomponentは、プレイヤーが接触するとゲームオーバーになるためのマグマに使用するほか、他のギミックにも使用できそうなので、Y軸方向に上るだけではなく、Vector3型でvelocityを設定することで、方向と速度を設定できるようにします。

2024-03-26 11-22-08_2.gif

Unity設定画面

image.png

コード全文

ItemMove.hs
component ItemMove
{
    Item m_item; //コンポーネントがセットされたItemを取得する
    
	Vector3 m_velocity; //移動する方向と距離

    public ItemMove()
    {
        m_item = hsItemGetSelf(); //コンポーネントがセットされたItemを取得する

        //コンポーネントがセットされたItemのvelocity(Vector3)というプロパティを取得する
        m_velocity = StrToVector3(m_item.GetProperty("velocity(Vector3)")); 
    }

    //毎フレーム呼びだされる。
	public void Update()
	{
        MoveItem();
	}

    //m_velocityに設定した速さを、現在のItemの位置に足す関数
    void MoveItem()
    {
		Vector3 pos = m_item.GetPos();
		pos.Add(Vector3MulFloat(m_velocity, hsSystemGetDeltaTime()));

		m_item.SetPos(pos);
    }

    //String型をVector3型に変換する関数
    Vector3 StrToVector3(string str)
    {
        Vector3 result;

        list<string> strVec = str.Split(",");
        result = makeVector3(strVec[0].ToFloat(), strVec[1].ToFloat(), strVec[2].ToFloat());
        return result;
    }

    //Vector3型とfloat型の掛け算を行う関数
    Vector3 Vector3MulFloat(Vector3 vec, float f)
    {
        Vector3 result;
        result = makeVector3(vec.x * f, vec.y * f, vec.z * f);
        return result;
    }
}

HEO Object

HEO Objectコンポーネントは、Actionや、HeliScriptでモデルを動かしたいときには必ず使用しなければならないコンポーネントです。
Vket Cloudで、3Dモデルを表示しようとした際には、HEO Fieldと、HEO Objectのどちらかを使用する必要がありますが、HEO Fieldで3Dモデルを書き出してしまうと、動かないStaticなものとして扱われてしまいます。

よって、3Dモデルを動かしたい際は、HEO Objectを使用する必要があるのですが、HEO Objectを使うには、一度3Dモデルを、.heo形式というVket Cloud特有の3Dモデル用フォーマットに手動で変換する必要があります。

.heoファイルを書き出すためには、

  1. 書き出したいゲームオブジェクトのトランスフォームをリセットする
  2. VketCloudSDK > フィールドをエクスポートを行う
    image.png

ことで、書き出すことが出来ます。

コード解説

メンバ変数の宣言とコンストラクタ

    Item m_item; //コンポーネントがセットされたItemを取得する
    
	Vector3 m_velocity; //移動する方向と距離

    public ItemMove()
    {
        m_item = hsItemGetSelf(); //コンポーネントがセットされたItemを取得する

        //コンポーネントがセットされたItemのvelocity(Vector3)というプロパティを取得する
        m_velocity = StrToVector3(m_item.GetProperty("velocity(Vector3)"));
    }

HeliScriptはメンバ変数の宣言と同時に初期化することは出来ないため、コンストラクタの中で初期化を行う必要があります。

Itemクラスの初期化

Itemクラスには、シーン上のItemを取得するための関数として、hsItemGet(string itemName)と、hsItemGetSelf()の二つがあります。
それぞれの使い分けとして、hsItemGet(string itemName)は、マネージャークラスといった複数のアイテムを操作するような全体統括をするコンポーネントに使用する。
hsItemGetSelf()は、一つのItemに対してのみ作用する、シーン上に複数配置するような一つの機能に使用する。
といった使い分けをしましょう。

m_velocityをpropertyから設定する。

    //String型をVector3型に変換する関数
    Vector3 StrToVector3(string str)
    {
        Vector3 result;

        list<string> strVec = str.Split(",");
        result = makeVector3(strVec[0].ToFloat(), strVec[1].ToFloat(), strVec[2].ToFloat());
        return result;
    }

image.png

Propertyからはstring型のkeyとvalueしか受け取れないため、string型の入力値をVector3型に変換する関数を自前で用意する必要があります。

intやfloat型であれば、それぞれのstringクラスにstring.ToInt()string.ToFloat()関数が用意されているので、そちらを利用します。

実際に動かす

    //毎フレーム呼びだされる。
	public void Update()
	{
        MoveItem();
	}

    //m_velocityに設定した速さを、現在のItemの位置に足す関数
    void MoveItem()
    {
		Vector3 pos = m_item.GetPos();
		pos.Add(Vector3MulFloat(m_velocity, hsSystemGetDeltaTime()));

		m_item.SetPos(pos);
    }

    //Vector3型とfloat型の掛け算を行う関数
    Vector3 Vector3MulFloat(Vector3 vec, float f)
    {
        Vector3 result;
        result = makeVector3(vec.x * f, vec.y * f, vec.z * f);
        return result;
    }

componentとして作成したスクリプトをItemに設定することで、毎フレーム呼び出されるUpdateを使用することが出来るようになります。

Update()関数内で、MoveItem()関数を呼び出しています。
MoveItem()関数は、現在のItemの位置に、propertyから取得したm_velocityと、hsSystemGetDeltaTime()という、前回のUpdateから何秒経過したかの値が返す関数をかけて、現在の位置に足し合わせる関数です。

これによって、現在の位置から、このフレームで実際に移動させたい距離を足すことが出来るようになります。

Vector3.Add()関数は使い方に少し癖がありますが、C#的な書き方をすると、

pos += m_velocity * hsSystemGetDeltaTime()

と同じように扱えます。

ただ、HeliScriptでは、Vector3 * floatを直接行うことが出来ないので、Vector3MulFloat(Vector3 vec, float f)関数を作成しています。

前 : HeliScriptを扱う上での事前設定&Tips
次 : HeliScriptでアイテムを反復して動かす【コピペで使えるサンプルコード付き】

株式会社HIKKY

Discussion