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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

3572閲覧

Unityです。次のスクリプトにてオフセットを使用したいです。

tunakan_ex

総合スコア21

Unity3D

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2017/12/30 16:43

編集2017/12/30 16:54

Unityです。次のスクリプトにてオフセットを使用したいのですがどう修正すればよいでしょうか。
回答よろしくお願いいたします。
※オフセットとはTransform objectToUse;のスタート位置のオフセットです。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4// © 2017 TheFlyingKeyboard 5// theflyingkeyboard.net 6//Moves object between two points 7public class MoveBetweenTwoPoints : MonoBehaviour { 8 [SerializeField] private float moveSpeed; 9 [SerializeField] private GameObject pointA; 10 [SerializeField] private GameObject pointB; 11 [SerializeField] private bool reverseMove = false; 12 [SerializeField] private Transform objectToUse; 13 [SerializeField] private bool moveThisObject = false; 14 private float startTime; 15 private float journeyLength; 16 private float distCovered; 17 private float fracJourney; 18 void Start() 19 { 20 startTime = Time.time; 21 if (moveThisObject) 22 { 23 objectToUse = transform; 24 } 25 journeyLength = Vector3.Distance(pointA.transform.position, pointB.transform.position); 26 } 27 void Update() 28 { 29 distCovered = (Time.time - startTime) * moveSpeed; 30 fracJourney = distCovered / journeyLength; 31 if (reverseMove) 32 { 33 objectToUse.position = Vector3.Lerp(pointB.transform.position, pointA.transform.position, fracJourney); 34 } 35 else 36 { 37 objectToUse.position = Vector3.Lerp(pointA.transform.position, pointB.transform.position, fracJourney); 38 } 39 if ((Vector3.Distance(objectToUse.position, pointB.transform.position) == 0.0f || Vector3.Distance(objectToUse.position, pointA.transform.position) == 0.0f)) //Checks if the object has travelled to one of the points 40 { 41 if (reverseMove) 42 { 43 reverseMove = false; 44 } 45 else 46 { 47 reverseMove = true; 48 } 49 startTime = Time.time; 50 } 51 } 52}

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

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

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

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

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

guest

回答1

0

ベストアンサー

Start内でpointA(もしくはpointB)とobjectToUseの相対位置を保存しておいて、それを移動時や反転判定の際に加減算するというのを試してみましたが、こういう意図でしょうか?

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4// © 2017 TheFlyingKeyboard 5// theflyingkeyboard.net 6//Moves object between two points 7public class MoveBetweenTwoPoints : MonoBehaviour { 8 [SerializeField] private float moveSpeed; 9 [SerializeField] private GameObject pointA; 10 [SerializeField] private GameObject pointB; 11 [SerializeField] private bool reverseMove = false; 12 [SerializeField] private Transform objectToUse; 13 [SerializeField] private bool moveThisObject = false; 14 private float startTime; 15 private float journeyLength; 16 private float distCovered; 17 private float fracJourney; 18 private Vector3 offset; 19 void Start() 20 { 21 startTime = Time.time; 22 if (moveThisObject) 23 { 24 objectToUse = transform; 25 } 26 journeyLength = Vector3.Distance(pointA.transform.position, pointB.transform.position); 27 offset = objectToUse.position - pointA.transform.position; // offsetをpointAからの相対位置とする 28 // offset = objectToUse.position - pointB.transform.position; // offsetをpointBからの相対位置とする 29 } 30 void Update() 31 { 32 distCovered = (Time.time - startTime) * moveSpeed; 33 fracJourney = distCovered / journeyLength; 34 if (reverseMove) 35 { 36 objectToUse.position = Vector3.Lerp(pointB.transform.position, pointA.transform.position, fracJourney) + offset; // offsetを加算 37 } 38 else 39 { 40 objectToUse.position = Vector3.Lerp(pointA.transform.position, pointB.transform.position, fracJourney) + offset; // offsetを加算 41 } 42 // offsetを減算 43 if ((Vector3.Distance(objectToUse.position - offset, pointB.transform.position) == 0.0f || Vector3.Distance(objectToUse.position - offset, pointA.transform.position) == 0.0f)) //Checks if the object has travelled to one of the points 44 { 45 if (reverseMove) 46 { 47 reverseMove = false; 48 } 49 else 50 { 51 reverseMove = true; 52 } 53 startTime = Time.time; 54 } 55 } 56}

フィールドを追加してオフセット移動をオン・オフできるようにしたり、pointApointBのどちらを基準にするかを切り替えられるようにしたりするともっと便利になりそうですね。

###[追記]
目的の動きを達成するには移動方法を変えてしまうのが手っ取り早そうですね。MoveTowardsが便利なように思います。
だいぶ元のコードから変わってしまいましたが、下記のようなパターンではどうでしょうか。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4// © 2017 TheFlyingKeyboard 5// theflyingkeyboard.net 6//Moves object between two points 7public class MoveBetweenTwoPoints : MonoBehaviour { 8 [SerializeField] private float moveSpeed; 9 [SerializeField] private GameObject pointA; 10 [SerializeField] private GameObject pointB; 11 [SerializeField] private Transform objectToUse; 12 [SerializeField] private bool moveThisObject = false; 13 private Transform destination; // 現在の目的地 14 void Start() 15 { 16 if (moveThisObject) 17 { 18 objectToUse = transform; 19 } 20 destination = pointA.transform; // pointAを最初の目的地に設定 21 } 22 void Update() 23 { 24 objectToUse.position = Vector3.MoveTowards(objectToUse.position, destination.position, moveSpeed * Time.deltaTime); // 目的地に向かって移動、ただし最大移動距離は移動速度×フレーム時間を超えないようにする 25 if (Vector3.Distance(objectToUse.position, destination.position) == 0.0f) //Checks if the object has travelled to one of the points 26 { 27 destination = destination == pointA.transform ? pointB.transform : pointA.transform; // 現在の目的地がpointAなら次の目的地をpointBに、さもなくば次の目的地をpointAに設定 28 } 29 } 30}

すみませんが今はUnityが手元になく、コンパイルが通るかすら未確認のコードです。うっかりした間違いがあるかもしれませんので、うまく動かないようでしたらお知らせください。

投稿2017/12/30 21:56

編集2017/12/31 04:12
Bongo

総合スコア10807

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

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

tunakan_ex

2017/12/31 02:14

回答ありがとうございます。 こちらのスクリプトを試してみました。 Point Bをスタート地点にした場合、開始時はPoint Bにoffset分足された位置からスタートする事ができましたが、Point Aをoffset分突き抜けた部分が折り返し地点となってしまっているようです。 しかも、こちらの意図したスタート地点であるPoint Bにオブジェクトが戻ることはありませんでした。Point Bにoffsetを足した位置がスタート地点になっているようです。 あくまでPoint AとPoint Bを行き来できるようにしたいです。offsetを足した場合は、Point AとPoint Bに収まる事を想定しています。
Bongo

2017/12/31 03:03 編集

確認しますが、下記のような感じの流れでしょうか? - objectToUseの初期位置はそのままobjectToUseの位置。 - スタートすると、objectToUseはpointAへ向かって動き出す。 - pointAへ到達すると、次にobjectToUseはpointBへ向かって動き出す。 - pointBへ到達すると、次にobjectToUseはpointAへ向かって動き出す。 - 以降、objectToUseはpointAとpointBの間を往復し続ける。 それと、もう一点確認したいのですが、pointAやpointBはプレイ中に位置が変化しうるでしょうか?もしobjectToUseの移動中にpointAやpointBの位置が変化したとしても、誘導ミサイルのようにpointAやpointBの動きに追従して、そちらに向かっていく動きであるべきでしょうか。
tunakan_ex

2017/12/31 03:13

上記の流れで問題ないです。 point Aとpoint Bはプレイ中に位置は変化しません。
tunakan_ex

2017/12/31 05:10

上記の追記ありがとうございます。うまく往復移動しているようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問