質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.62%

  • C#

    6839questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity3D

    1242questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unityで、Lerpというものを使いたいのですがなにが間違っているのかわかりません。

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 5,414
2つの操作キャラクターに一つのカメラをつける。
これをspeceボタンを押すことで切り替えるようにしたい。その時、Lerpというものを使いいきなり画面が変わるのではなく徐々に追従するキャラを切り替えるようにしたいです。(イメージ的にはピクミンみたいな感じ)
イメージ説明
とりあえず、移動部分だけ書いてみました。よろしくお願いします。
using UnityEngine;
using System.Collections;

public class LerpCamera : MonoBehaviour {
    public float camera_speed = 5.0f;
    bool flag = false;//0:Aを操作中 それ以外:Bを操作中
    GameObject mainCamera;
    GameObject A;
    GameObject B;
    /*Vector3 A_pos ;
    Vector3 B_pos ;*/

    // Use this for initialization
    void Start () {
        mainCamera = GameObject.Find("MainCamera");
        A = GameObject.Find("A");//gameobject Aの取得
        B = GameObject.Find("B");//gameobject Bの取得
    }
    
    // Update is called once per frame
    void Update () {
        Lerp();
    }


    void Lerp(){
        if(Input.GetKeyDown(KeyCode.Space)){
            if (flag == false){
                mainCamera.transform.position = Vector3.Lerp(A.transform.position, B.transform.position, Time.deltaTime*camera_speed);
                flag = true;
            }else{
                mainCamera.transform.position = Vector3.Lerp(B.transform.position, A.transform.position, Time.deltaTime*camera_speed);
                flag = false;
            }
        }
    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

Lerp関数は第一引数を0、第二引数を1、第三引数の値を間の値(0~1)として返す関数です。
一度実行すれば全自動、の様な関数ではありません。

動いている間は常に実行されているという事です。

using UnityEngine;

public class LerpCamera : MonoBehaviour {

    public GameObject target;

    float speed = 5.0f;
    float offset = -3.0f;

    void Update()
    {
        if (target == null) return;
        Vector3 position = target.transform.position + target.transform.forward * offset;
        transform.position = Vector3.Lerp(transform.position, position, speed * Time.deltaTime);
        transform.rotation = Quaternion.Lerp(transform.rotation, target.transform.rotation, speed * Time.deltaTime);
    }
}

positionだけでは回転しませんのでQuaternionも使用します。

このスクリプトをカメラにのせて、
シーンに適当にゲームオブジェクトを配置(位置、アングルも)してプレイ。

カメラのインスペクターのLerpCameraスクリプトにtarget変数がありますので、
シーンに配置したゲームオブジェクトを放り込んでみて下さい。

targetにゲームオブジェクトが入れば、targetがnullではなくなるので、Lerp関数を利用してカメラがtargetのoffset後方に移動、視点はtargetの向きに移動するかと思います。

ただ、思ったとおりの動きにはなっていないと思います。直線的に動きますので、図のように弧を描くような動きにもなりません。

ピクミンがどういった動きをするのかは知りませんが、
ここから先は数学の分野です。
計算です、少なくとも簡単ではありません。

理想の動きを作るならLerp関数自体、使わないのかもしれませんね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/07/20 16:10

    配置したオブジェクトにこのスクリプトを乗せても良いです。

    using UnityEngine;

    public class Target : MonoBehaviour {

    void OnMouseDown()
    {
    GameObject.Find("Main Camera").GetComponent<LerpCamera>().target = this.gameObject;
    }
    }

    マウスでクリックしたら、そのオブジェクトの後方に移動します。
    プレイモードのみでの動作テスト用です。

    キャンセル

  • 2015/07/21 14:49

    ありがとうございます。とりあえず、Lerp関数がどういったものなのかがわかりました。

    実際動かしてみると、思っていた動きとはかなり異なったのでやはりLerp関数は使わないのがいいのかもしれません。他の方法を考えてみます。
    ありがとうございました。

    キャンセル

0

こんにちは。Vector3.Lerpというものはご存知ですか?これを使えば滑らかにプレイヤーをカメラ追従できます。もちろん、上記の質問に対しても、応用がきくのでやってみてください。

using UnityEngine;
using System.Collections;

public class CameraControl : MonoBehaviour {

    private GameObject player = null;
    private Vector3 offset = Vector3.zero;
    private String[] player_elements =
        {
            "player1",
            "player2",
            "player3"
        };
    private int index = 0;
    void Start () {
        offset = transform.position - player.transform.position;
    }

    void LateUpdate () {
       player = GameObject.FindGameObjectWithTag(player_elements[index]);
        if(Input.GetMouseButtonDown(0)){
           if(index < player_elements.Length)
            {
                index++;
                player = player_elements[index];
            }
        }
        Vector3 newPosition = transform.position;
        newPosition.x = player.transform.position.x + offset.x;
        newPosition.y = player.transform.position.y + offset.y;
        newPosition.z = player.transform.position.z + offset.z;
        //ここで追従処理を滑らかにできる。
        transform.position = Vector3.Lerp(transform.position,newPosition,5.0f * Time.deltaTime);
    }
}


これでどうでしょうか?
※player1,player2,player3これらのタグがないといけないです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.62%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    時間制限をつけたいのですが、

    C#スクリプトを使って、3Dのゲーム制作をしています。この数字画像を使って15:00という文字を表示しつつ15:00~00:00となっていくようにして、00:00となったら「タイム

  • 解決済

    Unity 突進型の敵キャラAI

    Unityでプレイヤーに突っ込んでくるタイプの敵を作りたいのですが 今のスクリプトだと読み込んだ時にプレイヤーが居た位置に移動した後 その場で止まってしまいます。 突進を回避して

  • 解決済

    Unity2DでのRPGのマップシステム

    Unity2DでRPGツクールみたいなマップシステム(キャラクターの最小移動単位がマップチップの大きさと等しく、二次元配列でマップの状態を表現できるようなもの)をつくろうとして、下

  • 受付中

    Unityでのナビゲーションラインの実装について

    unityでナビゲーションラインを実装したいと思っています。 画像中央の青いラインみたいなもの、プレイヤーから特定のオブジェクトに対して線を引き、方向を教える。 現在LineRe

  • 受付中

    unity 3Dキャラ視点での移動方法

    現在unityちゃんを使って移動をしています。 3Dゲーム開発講座を使っているのですが、 移動方法がワールド座標での方向固定でカメラをキャラに追尾させても 歩く方向はやは

  • 解決済

    Unity 画面揺れ

    Unityで2Dのランゲームを作っています。キャラクターがダメージを受けた時に画面を揺らしたいのですが、どのようにすればいいかわからず困っています。 海外の方のブログ?から引っ張

  • 解決済

    Unityのメインカメラのスクリプトについて

    前提・実現したいこと 360°カメラの画像を球体に張り付けてカメラを動かして中を見ようと思い、カメラにアタッチするスクリプトで、とりあえず以下のものを作ろうとしています。 1.

  • 解決済

    Unityのオブジェクトの表示、非表示についての質問です

    ↓これはカメラにつけたスクリプトなのですが、 やりたいことはカメラのZ座標が300を超えたらSphere100をfalseにしてSphere101を有効にするというスクリプト

同じタグがついた質問を見る

  • C#

    6839questions

    C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

  • Unity3D

    1242questions

    Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。