要点
Unityで簡単な壁当てのようなプログラムを作りたいと思い床と壁とボールとプレイヤーのオブジェクトのみでプロジェクトを作りました。
スクリプトはプレイヤーにのみ付いていて移動、ボールと接触したときにボールを持つ、持ってる状態でスペースキー入力で投げるの3つのみの動作です。
タグについてボールにのみBallタグを付けそれ以外はUntaggedになっています。
発生している問題
プレイヤー側で何かにぶつかった判定をOnCollisionEnterでとり、TagがBallのときプレイヤーのhandにCollisionを保持しています。
ボールを掴むところまではできましたが掴んでいる時に壁等のオブジェクトにぶつかるとhandがそのオブジェクトに書き換えられてしまい、ボールは投げられず壁にはついていないRigidbodyが呼ばれてエラーになってしまいます。
MissingComponentException: There is no 'Rigidbody' attached to the "Wall" game object, but a script is trying to access it.
プレイヤーについたスクリプト
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerControl : MonoBehaviour 6{ 7 public float speed = 5f; 8 public float rotateSpeed = 120f; 9 public float power = 1; 10 private Collision hand =null; 11 12 void FixedUpdate() 13 { 14 15 float h = Input.GetAxis("Horizontal"); 16 float v = Input.GetAxis("Vertical"); 17 18 Vector3 velocity = new Vector3(0, 0, v); 19 20 // キャラクターのローカル空間での方向に変換 21 velocity = transform.TransformDirection(velocity); 22 23 // キャラクターの移動 24 transform.localPosition += velocity * speed * Time.fixedDeltaTime; 25 26 // キャラクターの回転 27 transform.Rotate(0, h * rotateSpeed * Time.fixedDeltaTime, 0); 28 29 30 } 31 32 void OnCollisionEnter(Collision collision) 33 { 34 Debug.Log(collision.gameObject.name); 35 if (collision.gameObject.tag=="Ball" && hand==null) 36 { 37 Debug.Log("catch"); 38 39 hand = collision; 40 hand.transform.parent = transform; 41 hand.collider.isTrigger = true; 42 Rigidbody RB = hand.gameObject.GetComponent<Rigidbody>(); 43 RB.isKinematic = true; 44 hand.transform.localPosition= new Vector3(0.5f, 0, 0.5f); 45 hand.transform.Rotate(0, 0, 0); 46 } 47 } 48 49 // Start is called before the first frame update 50 void Start() 51 { 52 53 } 54 55 // Update is called once per frame 56 void Update() 57 { 58 if (hand != null && Input.GetKeyDown(KeyCode.Space)) 59 { 60 hand.transform.Rotate(0, 0, 0); 61 hand.transform.localPosition = new Vector3(0, 0, 1.5f); 62 hand.collider.isTrigger = false; 63 Rigidbody RB = hand.gameObject.GetComponent<Rigidbody>(); 64 RB.isKinematic = false; 65 RB.AddForce(hand.transform.forward * power); 66 hand.transform.parent = null; 67 Debug.Log(hand.transform.parent); 68 hand = null; 69 Debug.Log("Release"); 70 } 71 } 72}
プレイヤーの移動に関してはこちらのサイトを参考にさせていただきました。
試したこと・わかっていること
ボールを掴んでいる時に壁に触れるとログにcatchと表示されずにhandが書き換わっているのでどこが原因か一切わからないです。
ボール掴み時は常にボールとは接触していますがOnCollisionEnterを利用しているので壁に触れない限り呼ばれません。ログを表示させてみたところボール掴み時に壁に触れた瞬間にhandの中身が書き換わっていてどう手を付ければ良いのかもわかりません。
補足情報
OS:Windows 10
Ver:2019.4.4f1 Personal
回答1件
あなたの回答
tips
プレビュー