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

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

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

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

解決済

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

Sqitoh
Sqitoh

総合スコア10

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

1回答

0リアクション

0クリップ

231閲覧

投稿2022/09/24 09:13

前提

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

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C#

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

Unity3D

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

Unity

Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。