---
title: テレポート実装
slug: world-sdk-guide-ja/QCRJDPjbmJB3To1ThmbdA
docTags: 
createdAt: 2024-09-02T08:34:13.135Z
---

ZEPETOキャラクターが2つの異なるポイントにテレポートできるポータルを実装します。



![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-xQUSTAIqb6XR3_ijDqhI3-20240904-102421.gif)



## ステップ1：テレポートのターゲットポイントを設定する



- シーンにZEPETOキャラクター作成コードをデフォルトとして実装します。

:::hint{type="info"}
**📘&#x20;**&#x4EE5;下のガイドを参照してください。\[[ZEPETOキャラクターを作成する](docId\:X3HPJvYg3lwW0PU1r8k1s)]
:::



1\) テレポートするポイントを作成します。

- このガイドでは、これらをAポイントとBポイントと呼びます。
- 階層を作成 > 3Dオブジェクト > プレーンを作成し、Plane\_Aに名前を変更します。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-YPfNLxuMmybV-RiO0UnQh-20240904-102421.png)



2\) テレポートを開始するポータルオブジェクトを追加します。

- オブジェクトと相互作用するためにコライダーを追加してください。
  - 衝突を検出するためのエリアのサイズを調整します。
  - Is Triggerを確認してください。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-zsw3KDDtRnc65lbmesDh1-20240904-102421.png)



3\) 同様の方法で合計2つのテレポートポイントを作成します。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-esYtCDox6OMaljFjTWWNa-20240904-102421.png "テレポートポイントAの例")



![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-vB1mUIZBJCc8INMKDEr_A-20240904-102421.png "テレポートポイントBの例")



- ポイントが重ならないように位置を調整します。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-W8LMhFUKNiUbYj8h1QeEW-20240904-102421.png)



## ステップ 2 : スクリプトを書く



1\) プロジェクトを作成 > 作成 > ZEPETO > TypeScript として名前を Teleport に変更します。

2\) 以下のようなサンプルスクリプトを書きます。

- スクリプトがアタッチされているオブジェクトのコライダーエリア内でZEPETOキャラクターとの衝突が検出されたときに、destinationObjectとともにテレポートするロジック。

```typescript
import { Collider, Vector3, Quaternion, GameObject } from 'UnityEngine';
import { SpawnInfo, ZepetoCharacter, ZepetoPlayer, ZepetoPlayers } from 'ZEPETO.Character.Controller';
import { ZepetoScriptBehaviour } from 'ZEPETO.Script';
 
export default class Teleport extends ZepetoScriptBehaviour {
     
    // テレポート先のオブジェクト
    public destinationObject: GameObject;
 
    private _localCharacter: ZepetoCharacter;
 
    Start() {
        // ローカルプレイヤーを見つけて _localCharacter に設定します
        ZepetoPlayers.instance.OnAddedLocalPlayer.AddListener(() => {
            this._localCharacter = ZepetoPlayers.instance.LocalPlayer.zepetoPlayer.character;
        });
    }
 
    OnTriggerEnter(collider: Collider) {
        // _localCharacter がまだ設定されていない場合、または衝突した gameObject が _localCharacter でない場合は関数を実行しない
        if (this._localCharacter == null || collider.gameObject != this._localCharacter.gameObject) {
            return;
        }
 
        // _localCharacter を destinationObject の位置にテレポートします
        this._localCharacter.Teleport(this.destinationObject.transform.position, Quaternion.identity);
    }
}
```



3\) スクリプトの記述が完了したら、テレポートを開始するポータルオブジェクトにスクリプトを追加します。

4\) インスペクターで、Destination Object を割り当てます。

- Destination Object : テレポートの終点に到着するポータルオブジェクト。

::Image[]{src="https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-y-PuKoPDgX5mbE1uVnOUE-20240904-102421.png" size="62" width="424" height="601" position="center" showCaption="false"}



## ステップ 3 : 実行



ポータルの近くにいるときに、ZEPETOキャラクターをポイントAからポイントBにテレポートします。

![](https://api.archbee.com/api/optimize/fCt3n1oCa8rgNJ8fw9I2N-FjXBe_11wP8xMnFzwYT_M-20240904-102421.png)



:::hint{type="danger"}
- このガイドは、私が操作するローカルプレイヤーのテレポートのみを扱います。
- マルチプレイヤーの世界の場合、他のプレイヤーの位置の同期が追加で必要です。
- マルチプレイヤーサンプルの同期コンポーネントを使用すると、位置の同期が簡単に実装できます。
:::



:::hint{type="info"}
**📘 マルチプレイサンプル - Zepetoマルチプレイコンポーネント**
[https://github.com/naverz/zepeto-multiplay-example/tree/main/Assets/Zepeto Multiplay Component](https://github.com/naverz/zepeto-multiplay-example/tree/main/Assets/Zepeto%20Multiplay%20Component)
:::

