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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Oculus Quest

Oculus Questは、Facebookの小会社であるOculus VRが開発したVRヘッドセットです。独立型でPCやスマートフォンは不要。6DoFのトラッキングに優れている点が特徴です。すでに販売終了となっていますが、2020年10月には後継のOculus Quest 2が販売されています。

C#

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

Unity3D

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

Unity

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

Q&A

解決済

2回答

3075閲覧

Unityで子オブジェクトが親オブジェクトのスケールに影響されないようにしたい。

zunzun

総合スコア1

Oculus Quest

Oculus Questは、Facebookの小会社であるOculus VRが開発したVRヘッドセットです。独立型でPCやスマートフォンは不要。6DoFのトラッキングに優れている点が特徴です。すでに販売終了となっていますが、2020年10月には後継のOculus Quest 2が販売されています。

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/09/14 09:40

前提

UnityでMetaQuest2(旧OculusQuest2)のVRゲームを作っているのですが、思うように動かないところがあります。
Quest2のコントローラーの距離に応じて親となるCubeを出現し変形させ、その中に子オブジェクトとして小さい立方体を入れようとしています。ですが、子オブジェクトのスケールが親オブジェクトのスケールに影響されて変更されてしまいます。
親オブジェクトのスケールを変形した後に子オブジェクトとして立方体を入れているのですが、子オブジェクトもスケールが変わってしまいます。

実現したいこと

子オブジェクトが親オブジェクトのスケールに影響されないようにしたい。

該当のソースコード

(検証中のため、関数がローマ字になっているところがあります)

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class creatcube : MonoBehaviour 7{ 8 [SerializeField] GameObject rightController; 9 [SerializeField] GameObject leftController; 10 public GameObject parent; //親オブジェクト 11 public GameObject RFcube; 12 13 public Text text; 14 private List<GameObject> koList = new List<GameObject>(); 15 Vector3 endA; 16 Vector3 endB; 17 float span; 18 19 // Start is called before the first frame update 20 void Start() 21 { 22 parent = Instantiate(parent,Vector3.zero, Quaternion.identity); //親オブジェクト 23 } 24 25 // Update is called once per frame 26 void Update() 27 { 28 29 30 Vector3 rHandPos = rightController.transform.position; 31 Vector3 lHandPos = leftController.transform.position; 32 33 34 //Aボタンを押したところをendAにする 35 if (OVRInput.GetDown(OVRInput.RawButton.A)) 36 { 37 endA = lHandPos; 38 39 } 40 //押し続けている間endBは右コントローラーの位置 41 //押し続けている間も表示する 42 else if (OVRInput.Get(OVRInput.RawButton.A)) 43 { 44 endB = rHandPos; 45 46 } 47 //ボタンを離したところをendBとする 48 //endA~endB間にオブジェクトを生成する 49 else if (OVRInput.GetUp(OVRInput.RawButton.A)) 50 { 51 52 53 54 endB = rHandPos; 55 span = Vector3.Distance(endA, endB); //AーB距離 56 57 Vector3 tyuuou = Vector3.Lerp(endA, endB, 0.5f); //中間座標 58 59 60 61 parent.transform.localScale = new Vector3(span, 1, 1); 62 parent.transform.localPosition = tyuuou; 63 64 65 66 GameObject obj = Instantiate(RFcube, Vector3.zero, Quaternion.identity); //子 67 obj.transform.parent = parent.transform; //parent(親オブジェクト)の子オブジェクトに設定 68 obj.transform.localPosition = new Vector3(0, 0, 0); 69 obj.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f); 70 koList.Add(obj); 71 72 } 73 74 //右人差し指ボタンを押している間 75 if (OVRInput.Get(OVRInput.RawButton.RIndexTrigger)) 76 { 77 78 for(int i = 0; i < koList.Count; i++) 79 { 80 Vector3 y = new Vector3(1, (rHandPos.y-lHandPos.y), 1); 81 koList[i].transform.localScale = y; 82 } 83 84 85 } 86 87 } 88} 89

試したこと

オブジェクトを出す順番、スケール変更の順番、子オブジェクトにする順番などを色々変えてみましたが駄目でした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

親オブジェクトを「ヒエラルキー上の親」と「目に見える伸縮するキューブ」の2つに役割分担するのはどうでしょうかね?
一例としては下記のような形はいかがでしょう。

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class creatcube : MonoBehaviour 7{ 8 [SerializeField] GameObject rightController; 9 [SerializeField] GameObject leftController; 10 public GameObject parent; //親オブジェクト 11 public GameObject RFcube; 12 13 public Text text; 14 private List<GameObject> koList = new List<GameObject>(); 15 Vector3 endA; 16 Vector3 endB; 17 float span; 18 19 // 後述の「目に見える親キューブ」を保持しておくフィールドを追加する 20 Transform parentCube; 21 22 // Start is called before the first frame update 23 void Start() 24 { 25 // 親オブジェクト自体は目に見えない空のオブジェクトとしておき... 26 var parentPrefab = parent; 27 parent = new GameObject("Parent"); 28 29 // 目に見える親キューブは、ヒエラルキー上の親オブジェクトの子として配置する 30 parentCube = Instantiate(parentPrefab, parent.transform).transform; 31 } 32 33 // Update is called once per frame 34 void Update() 35 { 36 Vector3 rHandPos = rightController.transform.position; 37 Vector3 lHandPos = leftController.transform.position; 38 39 //Aボタンを押したところをendAにする 40 if (OVRInput.GetDown(OVRInput.RawButton.A)) 41 { 42 endA = lHandPos; 43 44 } 45 //押し続けている間endBは右コントローラーの位置 46 //押し続けている間も表示する 47 else if (OVRInput.Get(OVRInput.RawButton.A)) 48 { 49 endB = rHandPos; 50 51 } 52 //ボタンを離したところをendBとする 53 //endA~endB間にオブジェクトを生成する 54 else if (OVRInput.GetUp(OVRInput.RawButton.A)) 55 { 56 endB = rHandPos; 57 span = Vector3.Distance(endA, endB); //AーB距離 58 59 Vector3 tyuuou = Vector3.Lerp(endA, endB, 0.5f); //中間座標 60 61 // 親オブジェクトについては、ヒエラルキー上の真の親のスケールは1倍のまま変えない 62 // parent.transform.localScale = new Vector3(span, 1, 1); 63 64 // 代わりに、目に見える親キューブのスケールを変える 65 parentCube.localScale = new Vector3(span, 1, 1); 66 67 parent.transform.localPosition = tyuuou; 68 69 GameObject obj = Instantiate(RFcube, Vector3.zero, Quaternion.identity); //子 70 obj.transform.parent = parent.transform; //parent(親オブジェクト)の子オブジェクトに設定 71 obj.transform.localPosition = new Vector3(0, 0, 0); 72 obj.transform.localScale = new Vector3(0.05f, 0.05f, 0.05f); 73 koList.Add(obj); 74 } 75 76 //右人差し指ボタンを押している間 77 if (OVRInput.Get(OVRInput.RawButton.RIndexTrigger)) 78 { 79 for (int i = 0; i < koList.Count; i++) 80 { 81 Vector3 y = new Vector3(1, (rHandPos.y - lHandPos.y), 1); 82 koList[i].transform.localScale = y; 83 } 84 } 85 } 86}

念のため申し上げますと、このやり方ですと親子関係の構造が変わるため、もし親キューブにも別のスクリプトがアタッチされているのでしたらそちらにも修正を加えてやる必要があるかもしれません。

投稿2022/09/17 21:02

Bongo

総合スコア10807

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

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

zunzun

2022/09/21 01:56

返信遅くなってしまい申し訳ありません。この方法で無事解決できました!本当にありがとうございます!!
guest

0

parentプロパティに対して親をそのまま指定すると、(子オブジェクトは)ワールド座標が維持された状態になります。
親に対しての相対位置(ローカル座標)を指定したい場合は、SetParent関数などを使ってください。
ただしSetParentはそこそこ重い処理(というよりTransformの変更が重い)ため、
Instantiateとしたときに親を指定したほうがいいでしょう。

C#

1// 位置も回転も0なら指定は不要 2GameObject obj = Instantiate(RFcube, parent.transform, false);

投稿2022/09/16 09:52

Kerupim

総合スコア52

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問