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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

500閲覧

SetParentを使用後、勝手に親子関係ができる

Sqitoh

総合スコア10

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2022/09/24 09:13

前提

SetParent(transform)を用いて親子関係を結んだ際、
Aと親子→Bと親子という風にスクリプトで変化させると、Bと親子になったのちに勝手にAの子に戻る。

実現したいこと

犬がボールを拾って持ってくるように、
「投げた球を追う→拾う→プレイヤーのもとに帰る」ということが何度もできるようにしたい。

現状、初期の落ちている球に対しては、
追う:ボールの位置をNavMeshAgentの目的地とする
拾う:犬とボールの距離が基準値以下となったら球を犬オブジェクトの子にする
帰る:プレイヤーの位置をNavMeshAgentの目的地とする
という手段でそれっぽい動きができています。

発生している問題・エラーメッセージ

犬が持って帰ってきた球を再度投げるときに問題が起きる。
①犬が持って帰ってきた球をつかんだ際に親子関係を切るために
SetParent(null)もしくはSetParent(適当なObj.transform)を行う。
②投げる
③勝手にまた犬オブジェクトの子になる(ので犬は追いつけなくなる)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.XR.Interaction.Toolkit; 5using UnityEngine.AI; 6 7public class BallPlay : MonoBehaviour 8{ 9 [SerializeField] GameObject Ball; 10 [SerializeField] GameObject Player; 11 //private PlayerState state; 12 private XRGrabInteractable ball; 13 private NavMeshAgent _agent; 14 private bool PickUpFlag; 15 private bool IdleFlag; 16 17 // Start is called before the first frame update 18 void Start() 19 { 20 ball = Ball.GetComponent<XRGrabInteractable>(); 21 _agent = GetComponentInParent<NavMeshAgent>(); 22 PickUpFlag = true; 23 IdleFlag = true; 24 } 25 26 // Update is called once per frame 27 void Update() 28 { 29 if (!ball.isSelected) 30 { 31 if (ComparePosition(Ball) > 0.75) 32 { 33 Chasing(); 34 Debug.Log("Chase"); 35 } 36 else 37 { 38 PickUpFlag = PickUp(PickUpFlag); 39 Returning(); 40 Debug.Log("Return"); 41 } 42 } 43 else 44 { 45 IdleFlag = Idle(IdleFlag); 46 Debug.Log("Catch"); 47 } 48 } 49 50 void Chasing() 51 { 52 _agent.destination = Ball.transform.position; 53 } 54 55 void Returning() 56 { 57 _agent.destination = Player.transform.position; 58 } 59 60 float ComparePosition(GameObject Obj) 61 { 62 var diff = Obj.transform.position - transform.position; 63 var distance = diff.magnitude; 64 return distance; 65 } 66 67 bool PickUp(bool flag) 68 { 69 if (flag) 70 { 71 //TODO Anim.SetTrigger? 72 Ball.transform.position = new Vector3(transform.position.x, transform.position.y+0.75f, transform.position.z); 73 Ball.transform.SetParent(transform); 74 Debug.Log("Pick Up"); 75 } 76 return false; 77 } 78 79 bool Idle(bool flag) 80 { 81 if (flag) 82 { 83 transform.DetachChildren(); 84 //TODO Anim.SetTrigger? 85 } 86 return false; 87 } 88}

試したこと

SetParent(null)でなくSetParent(適当なObj.transform)やDetachChildren()を試した。
しかしやはり、
ボールをつかむ→親子関係が切れる→ボールを離す→また犬オブジェクトの子になる
を繰り返した。

補足情報(FW/ツールのバージョンなど)

ボール:Sphere オブジェクト(XRGrabInteractable)
犬:EmptyObject(NavMeshAgent)>犬Object(BallPlay.cs)←今回のスクリプト
プレイヤー:XROrigin

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

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

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

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

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

guest

回答1

0

自己解決

XRGrabInteractableでつかんだ時に勝手に親子関係が切れているかも?
その際、つかんでいたものを離すと、元のつかむ前の親子関係に戻っているよう。
つかむ前に親子関係を変更させれるようにXRGrabInteractableのON/OFFやSetParentの順番を変えるとうまくいった

投稿2022/09/26 06:26

Sqitoh

総合スコア10

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問