前提
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。