【Vket Cloud】動画つき！ゼロから始めるHeliScript超入門⑩ - HeliScriptでVector3を使ってシーン上のアイテムを移動させる

# はじめに
Vket Cloudでは、「HeliScript」という独自のスクリプトを使用してコーディングを行うことで、ワールド内に高度なギミックを導入することが出来ます。

本記事では、HeliScriptのVector3クラスの概要とVector3クラスを使ってシーン上のアイテムを移動させる方法を紹介します。

# 動画

<iframe width="560" height="420" src="https://www.youtube.com/embed/vehiYFadgxs?si=piijVykCGIKYqeOO" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# 移動が出来るアイテムの用意
VKC Item Field Unityコンポーネントによってつくられるアイテムは、今回のスクリプトを使用しても移動させることができません。

移動させることが出来る3Dモデルのアイテムを作るためには、VKC Item Object Unityコンポーネントを使用したアイテムを用意する必要があります。

VKC Item Object Unityコンポーネントで利用できるアイテムを作るためには、3Dモデルの.heoファイルを作成する必要があります。

## 3Dモデルの.heoファイルを作成する
まず、Hierarchyビュー上で右クリックし、Create Emptyを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/b0ba9c6a-770f-5ed0-f8d2-f9f406d1d033.png)

作成した空のオブジェクトのPositionを(0,0,0)、Rotationを(0,0,0)、Scaleを(1,1,1)にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/ffae6a18-874f-62fa-7480-9e7425cfc950.png)

空のオブジェクトの子オブジェクトに3Dモデルを追加します。
オブジェクトの中心が(0,0,0)になるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/eef63d96-7e6d-34ef-9a71-3926bf8a68fd.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/62d7eee6-90c3-cec8-0910-bdb05ea83bed.png)
上の画像の場合、空のオブジェクトの中に3つのCubeオブジェクトを入れました。
これを書きだし元オブジェクトとします。

ここまで出来たら、親となる空オブジェクトを選択した状態で、「フィールドのエクスポート」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/a1556295-a091-8f1e-48a6-f230737aaff7.png)

保存画面が表示されるので、新しいフォルダを作成し、その中に保存します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/05ad3dfd-6320-3073-f0e6-765dd9845472.png)

:::note warn
保存時に複数ファイル作成されます。必ず、何も入っていないフォルダの中に作成するようにしましょう。
:::

これで、3Dモデルの.heoファイルの完成です。

## 作成した.heoファイルをシーンに取り込む

新しく空のオブジェクトを作成し、VKC Item Object Unityコンポーネントを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/3620e88f-2b9e-704a-5ad2-24c1366cb40d.png)

:::note
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/71020f20-1d86-8bbe-aac5-f246058c9bbd.png)
追加したオブジェクトは、どのオブジェクトの子オブジェクトにもなっていない状態が好ましいです。
:::

VKC Item Objectの.heoの欄の「選択」を押し、先程作成した.heoファイルを追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/9f3550e5-2710-6a4f-428c-a2f43a3fb98f.png)

ビルドと実行を選択することで、シーン上に3Dモデルオブジェクトが出現します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3788807/f2802fd0-31aa-5636-5fb6-d1e704ace412.png)

# スクリプトの作成

作成したアイテムを動かすスクリプトを作成します。
オブジェクトの移動には`SetPos()`関数、`GetPos()`関数を使用します。
また、これらの関数ではVector3クラスを使用します。

## Vector3クラスとは？
x,y,zの3つのfloat情報を持つクラスです。
3次元ベクトルを表現するのに使用されます。
今回は、X座標、Y座標、Z座標の値をこのクラスを利用して表現します。

## スクリプトの記載

```
    Item object; // オブジェクト情報を格納するアイテムクラス変数
    Vector3 object_pos; // オブジェクトの座標情報を格納するVector3クラス変数
    int moveVector; // 移動方向制御に利用する変数
    float timer; // 時間測定に利用する変数
    
    object = hsItemGet("ExampleObject"); // ExampleObjectの情報をobjectに格納
    moveVector = 1;

    public void Update(){ // 毎フレーム動作するUpdate関数
        timer += hsSystemgetDeltaTime(); // 時間の測定
        object_pos = object.GetPos(); // オブジェクトの座標を取得し格納
        object_pos = makeVector3(object_pos.x,object_pos.y + (moveVector*0.05f), object_pos.z); // オブジェクト座標格納変数のY情報にmoveVectorの0.05倍を加算
        object.SetPos(object_pos); // 計算により変化したobject_posをオブジェクトに適用
        if(timer>=3){// 3秒を超えた時
            moveVector *= -1; // moveVectorのプラマイ反転
            timer = 0; // タイマーリセット
        }
    }    
```

上記のスクリプトでは、オブジェクトの座標を取得した後、Y情報にmoveVectorの0.05倍を加算したものでオブジェクト座標を更新しています。
また、3秒おきにmoveVectorの正負が入れ替わるようになっています。
これにより、このスクリプトでは、上方向あるいは下方向にオブジェクトが進みつづけ、3秒おきに移動方向が入れ替わるという動作を発生させます。

`Item.GetPos()`関数は、現在のアイテムの座標をVector3形式で取得します。
`Item.SetPos(Vector3 targetPos)`関数は、アイテムの座標を引数のVector3クラスで指定したものに変更します。

今回紹介したものではUpdate関数にて微小の変化を加えたVector3クラス変数を`SetPos()`関数で適用したため、オブジェクトが動いているような挙動となりましたが、`SetPos()`関数で実際に発生している動作は瞬間移動となります。

:::note
スクリプト中で使用している`*=`は乗算代入と言い、左側の変数に右側の値を掛け合わせた数を入れる、という意味の命令になります。
`*`はShiftキーを押しながら`:`(コロン)キーを押すと入力できます。
掛け算の×と同様の意味となります。
また、割り算の÷と同様の意味を持つ演算子記号は`/`(スラッシュ)です。
:::

次 : [⑪ HeliScriptでプレイヤーを取得しワープさせる](<https://qiita.com/shirapy/private/f798f8daef57840035fc>)
前 : [⑨ HeliScriptのUpdate()関数について](<https://qiita.com/shirapy/items/ba5417cc9bce2f4de618>)