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

前提

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

実現したいこと

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

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

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

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

該当のソースコード

C#

using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.XR.Interaction.Toolkit;using UnityEngine.AI; public class BallPlay : MonoBehaviour { [SerializeField] GameObject Ball; [SerializeField] GameObject Player; //private PlayerState state; private XRGrabInteractable ball; private NavMeshAgent _agent; private bool PickUpFlag; private bool IdleFlag; // Start is called before the first frame update void Start() { ball = Ball.GetComponent<XRGrabInteractable>(); _agent = GetComponentInParent<NavMeshAgent>(); PickUpFlag = true; IdleFlag = true; } // Update is called once per frame void Update() { if (!ball.isSelected) { if (ComparePosition(Ball) > 0.75) { Chasing(); Debug.Log("Chase"); } else { PickUpFlag = PickUp(PickUpFlag); Returning(); Debug.Log("Return"); } } else { IdleFlag = Idle(IdleFlag); Debug.Log("Catch"); } } void Chasing() { _agent.destination = Ball.transform.position; } void Returning() { _agent.destination = Player.transform.position; } float ComparePosition(GameObject Obj) { var diff = Obj.transform.position - transform.position; var distance = diff.magnitude; return distance; } bool PickUp(bool flag) { if (flag) { //TODO Anim.SetTrigger? Ball.transform.position = new Vector3(transform.position.x, transform.position.y+0.75f, transform.position.z); Ball.transform.SetParent(transform); Debug.Log("Pick Up"); } return false; } bool Idle(bool flag) { if (flag) { transform.DetachChildren(); //TODO Anim.SetTrigger? } return false; }}

試したこと

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

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

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

コメントを投稿

0 コメント