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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

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

Unity3D

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

Q&A

2回答

12562閲覧

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

matsu.mokkori35

総合スコア10

C#

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

Unity3D

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

0グッド

0クリップ

投稿2015/07/19 06:32

2つの操作キャラクターに一つのカメラをつける。
これをspeceボタンを押すことで切り替えるようにしたい。その時、Lerpというものを使いいきなり画面が変わるのではなく徐々に追従するキャラを切り替えるようにしたいです。(イメージ的にはピクミンみたいな感じ)
イメージ説明

とりあえず、移動部分だけ書いてみました。よろしくお願いします。

c#

1using UnityEngine; 2using System.Collections; 3 4public class LerpCamera : MonoBehaviour { 5 public float camera_speed = 5.0f; 6 bool flag = false;//0:Aを操作中 それ以外:Bを操作中 7 GameObject mainCamera; 8 GameObject A; 9 GameObject B; 10 /*Vector3 A_pos ; 11 Vector3 B_pos ;*/ 12 13 // Use this for initialization 14 void Start () { 15 mainCamera = GameObject.Find("MainCamera"); 16 A = GameObject.Find("A");//gameobject Aの取得 17 B = GameObject.Find("B");//gameobject Bの取得 18 } 19 20 // Update is called once per frame 21 void Update () { 22 Lerp(); 23 } 24 25 26 void Lerp(){ 27 if(Input.GetKeyDown(KeyCode.Space)){ 28 if (flag == false){ 29 mainCamera.transform.position = Vector3.Lerp(A.transform.position, B.transform.position, Time.deltaTime*camera_speed); 30 flag = true; 31 }else{ 32 mainCamera.transform.position = Vector3.Lerp(B.transform.position, A.transform.position, Time.deltaTime*camera_speed); 33 flag = false; 34 } 35 } 36 } 37} 38

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

C#

1using UnityEngine; 2using System.Collections; 3 4public class CameraControl : MonoBehaviour { 5 6 private GameObject player = null; 7 private Vector3 offset = Vector3.zero; 8 private String[] player_elements = 9 { 10 "player1", 11 "player2", 12 "player3" 13 }; 14 private int index = 0; 15 void Start () { 16 offset = transform.position - player.transform.position; 17 } 18 19 void LateUpdate () { 20 player = GameObject.FindGameObjectWithTag(player_elements[index]); 21 if(Input.GetMouseButtonDown(0)){ 22 if(index < player_elements.Length) 23 { 24 index++; 25 player = player_elements[index]; 26 } 27 } 28 Vector3 newPosition = transform.position; 29 newPosition.x = player.transform.position.x + offset.x; 30 newPosition.y = player.transform.position.y + offset.y; 31 newPosition.z = player.transform.position.z + offset.z; 32 //ここで追従処理を滑らかにできる。 33 transform.position = Vector3.Lerp(transform.position,newPosition,5.0f * Time.deltaTime); 34 } 35}

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

投稿2016/06/01 01:59

編集2016/06/01 02:32
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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 07:00

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/07/20 07:10

配置したオブジェクトにこのスクリプトを乗せても良いです。 using UnityEngine; public class Target : MonoBehaviour { void OnMouseDown() { GameObject.Find("Main Camera").GetComponent<LerpCamera>().target = this.gameObject; } } マウスでクリックしたら、そのオブジェクトの後方に移動します。 プレイモードのみでの動作テスト用です。
matsu.mokkori35

2015/07/21 05:49

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問