【Unity】オブジェクトが跳ね返らないのはなぜ?

このQ&Aのポイント
  • Unityでオブジェクトが壁に当たるたびに跳ね返らない問題が発生しています。なぜなのか原因がわかりません。
  • スクリプトを使用して跳ね返りを実装しているが、一部の場合には跳ね返らない現象が発生します。
  • スクリプトの衝突判定の処理に問題がある可能性があります。どのような部分を見直すべきでしょうか?
回答を見る
  • ベストアンサー

【Unity】オブジェクトが跳ね返らない

Unityの勉強どころか、プログラムの勉強を始めたばかりの者ですが、 質問にご回答いただけないでしょうか。 javaで壁に当たるたびに跳ね返るというオブジェクトを作りたいのですが、 下記のようなスクリプトでやってみた所、壁に衝突した際に跳ね返るときと、跳ね返らない時があります。 なぜ跳ね返らない時があるのかよくわからないのですが、いったい何故なのでしょうか? ---------------------------------------- #pragma strict var way = -1; var count = 0; function Update () { transform.position += Vector3.right * 5 * way * Time.deltaTime; } function OnCollisionEnter(collision: Collision) { count = count +1; Debug.Log(count); way = way * -1; } ------------------------------------------ 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

Unityで物体を跳ね返らせたいのならUpdate+transformは使うべきではない。 変わりにRigidbody+Collider+FixUpdate+Torqueを使ってください。 Unityは物理法則にしたがって物体が動く物理エンジンというものを持っていて、GameObjectにRigidbodyをつけるとそのGameObjectがUnity内臓物理エンジンによって勝手にtransformやrotateされるようになる。物理エンジンとtransformの手動変更は混ぜるな危険なのでどちらかを使うようにしましょう。 跳ね返らないときがあるのは、物体の移動のタイミングによって衝突する前にCollider同士がすり抜けているのでしょう。 自前でtransformを行うというのは、物理エンジンを自作するという事に他ならないので、 よほどのことがない限りはUnityにまかせた方が良いでしょう。

fujioranggge
質問者

お礼

なるほど!どこかのサイトで調べた際にそういった事が載せられていましたが、その時はあまりピンと来なくて… こういう形で問題が発生するんですね! 解りやすく説明していただきありがとうございました!

関連するQ&A

  • unityで今プログラムを組んでいます

    今prefabで生成した物(クローン)のY座標を配列に入れて その中で現在一番数値の多いものを表示というものを作りたいのですが以下のプログラムだと 現在の高さではなくクリックで生成した物の高さになってしまいます。 理由が分からないのでアドバイスお願いします。 var test : Transform; var foo2 = new Array(); function Update(){     //クリック if (Input.GetButtonDown ("Fire1")) { Instantiate(test, transform.position, transform.rotation);//生成 } } //判定 function OnCollisionEnter(info : Collision) { foo2[i] = this.transform.position.y;//配列代入 //配列の中身調べる for(var A = 0; A <= i; A++){ if(foo2[i] > SavePos_y){ SavePos_y = foo2[i]; Debug.Log(foo2[i]); i++; } }

  • unityでのプログラミングについて

    いまunityでゲームを制作していてシューティングのゲームをつくっています。 そこで次のようなプログラムを作成したのですがエラーが返ってきて困っています。 var bulletPrefab : GameObject; var bulletInterval : float = 0.2; var bulletEnable : boolean = true; var bulletVelocity : float = 100; var bulletTime : float = 0.0; (省略してます) function start(){ (省略してます) function update(){ if(Input.GetButton("Jump") && bulletEnable) { ←エラー箇所です。 bulletEnable = false; var bullet = Instantiate(bulletPrefab,transform.position,transform.rotation); var direction : Vector3 = Vector3(0,0,1); bullet.rigidbody.AddForce(direction * bulletVelocity,ForceMode.VelocityChange); } bulletTime += Time.deltaTime; if (bulletTime &gt;bulletInterval) { ←エラー箇所です。 bulletTime = 0.0; bulletEnable = true; } } 次のエラーが返ってきます。 Assets/character.js(22,19): BCE0044: expecting ), found ';'. Assets/character.js(22,20): BCE0043: Unexpected token: bulletInterval. こんな感じでエラーがでます。 解決方法を知ってる方は教えてください。おねがいします。

  • 【Unity】javascrptのデバッグについて

    javascriptにて、操作キャラクターがトラップオブジェクトに触れるとワープさせられるスクリプトを書いています。 そこでどうしてもビルドエラーが直らなくて困っています。 改善方法をご教授頂きたいです。 下記ソースコードとエラー文です。 -------ソースコード------- #pragma strict function OnTriggerEnter(other : Collider)    { if (other.gameObject.tag == "Player")        { ver respawn : GameObject = GameObject.FindWithTag("Respawn"); other.gameObject.transform.position = respawn.transform.position; } } -------エラー文------- Assets/respawn.js(6,21): BCE0043: Unexpected token: respawn. Assets/respawn.js(6,20): UCE0001: ';' expected. Insert a semicolon at the end.

  • unityでrigidbodyにする方法

    みようみまねでjavascriptで下のようなスクリプトを作り(ほとんどコピー)、 球を並べることはできましたが、これらの球が重力や衝突で自然に動くようにしたいのです。、 どうしたらいいのでしょうか? for(i=0;i<10;i++){ var obj=GameObject.CreatePrimitive(PrimitiveType.Sphere); obj.transform.Translate(i*10,30,0); } また、unity初心者用のサイトでお勧めのがありましたら教えてください。 よろしくお願いします。

  • UNITY Float型の接尾辞fって

    UNITYに限ったものではないのですが、Float型の接尾辞fについて Wikiやhttp://www.wisdomsoft.jp/40.html/を見てみたのですが ちょっと難しく理解できません。fってどのような時に使うのでしょうか? Vector3 構造体のコンストラクタの部分で public Vector3(float x, float y, float z)   ←となっていますが、 Vector3 v = new Vector3(765, 961, 876); ←fはついていないですし。 またUNITYのTransformで PositionをX=0.5、Y=0.5、Z=0.5とするのと、X=0.5f、Y=0.5f、Z=0.5fとするのと位置が全然違います。 分かりやすい説明、サイトなどあれば教えてください

  • Unity初心者ですコンパイルエラーで詰まってます

    HPを参考にシューティングゲームの勉強をしています。 そこでUnityのGameシーンで自機を動かしたり背景を付けたりは上手く行ったんですけど、次の背景を動かすというところで詰まりました。Background c#スクリプトを作成して  using System.Collections; using System.Collections.Generic; using UnityEngine; // 背景を制御するコンポーネント public class Background : MonoBehaviour { public Transform m_player; // プレイヤー public Vector2 m_limit; // 背景の移動範囲 // 毎フレーム呼び出される関数 private void Update() { // プレイヤーの現在地を取得する var pos = m_player.localPosition; // 画面端の位置を取得する var limit = Utils.m_moveLimit; // プレイヤーが画面のどの位置に存在するのかを、 // 0 から 1 の値に置き換える var tx = 1 - Mathf.InverseLerp( -limit.x, limit.x, pos.x ); var ty = 1 - Mathf.InverseLerp( -limit.y, limit.y, pos.y ); // プレイヤーの現在地から背景の表示位置を算出する var x = Mathf.Lerp( -m_limit.x, m_limit.x, tx ); var y = Mathf.Lerp( -m_limit.y, m_limit.y, ty ); // 背景の表示位置を更新する transform.localPosition = new Vector3( x, y, 0 ); } } を自分で打った時にコンパイルエラーが出たのでそのままコピーして 再度再生してみたらやっぱりcs 0117 で翻訳したら 画面端の位置を取得する所のm_moveLimitが定義されていませんという内容でした。 見本をそのままコピーしたので間違いが解りません。 ネットで調べたらpublic class Background をMy Backgroundに変えて解決出来ますとあったので試しましたが駄目でした。 本当は一からC#を勉強していけば解る問題かもしれないですけど まずは人の真似から段々と覚えていきたいのでこういう勉強方法を取っています。 Unityのバージョン内容もよく変わって使えない言葉が出てエラーに なったりもあるみたいなのでバージョンの関係もあるんでしょうか??。私が使っているのは2020.1.2f1です。 どうかUnityに詳しい方のお力をお貸し下さい。 よろしくお願いいたします。

  • Unity2DでX軸を瞬間移動したい。

    javascriptで作業をしています。 どう書けばいいのか分からず、拙いまとめ方ですがお願い致します。 クリック(タップ)で「GO」「BACK」のメッセージを出すスクリプトを其々当てたObjectを一回押すと、 X軸方向へ一定数(-方向と+方向)ポンっと瞬間移動っぽく移動し、 尚且つ、0値以降行かないようなスクリプトを書きたいのですが、 どのようにすれば良いでしょうか・・・・。 メッセージを出すスクリプトは以下です。 public var information : boolean = true; public var touch : boolean; public var target : GameObject; public var message : String; function Start() { touch = false; } function Update() { if (Input.GetMouseButtonDown(0)) { var tapPoint : Vector2 = Camera.main.ScreenToWorldPoint(Input.mousePosition); var collition2d : Collider2D = Physics2D.OverlapPoint(tapPoint); if (collition2d) { var hitObject : RaycastHit2D = Physics2D.Raycast(tapPoint,-Vector2.up); if (hitObject) { Debug.Log("Touch!" + hitObject.collider.gameObject.name); target.SendMessage( message, gameObject ); } } } } どうか宜しくお願い致します。

  • unityでのC++エラーの原因がわかりません!!

    最近unity2dで横スクロールアクションを勉強していて 今移動するなどのアニメーションを動かそうとしています しかし待機状態から移動するときのアニメーションに移行するスクリプトがうまくいきません 誰か教えてください error CS0411: The type arguments for method `UnityEngine.Component.GetComponent<T>()' cannot be inferred from the usage. Try specifying the type arguments explicitlyというエラーが出ます プログラムはこんな感じです using UnityEngine; using System.Collections; [RequireComponent(typeof(Rigidbody2D))] [RequireComponent(typeof(BoxCollider2D))] public class UnityChanController : MonoBehaviour { public Rigidbody2D cRigidbody2D { get { if(!_cRigidbody2D) _cRigidbody2D = rigidbody2D; return _cRigidbody2D; } } Rigidbody2D _cRigidbody2D; public Transform cTransform { get { if(!_cTransform) _cTransform = transform; return _cTransform; } } Transform _cTransform; public Animator cAnimator { get { if(!_cAnimator) _cAnimator = GetComponent(); return _cAnimator; } } Animator _cAnimator; public float moveSpeed = 5; public float jumpForce = 1000; float InputHorValue; bool isGrounded; bool canJump; void Update() { MecCheck(); InputCheck(); } void InputCheck() { InputHorValue = Input.GetAxisRaw("Horizontal"); if(isGrounded && Input.GetButtonDown("Jump")) canJump = true; } void MecCheck() { bool isRunning = InputHorValue != 0; cAnimator.SetBool("isRunning",isRunning); } void FixedUpdate() { Move(); Jump(); } void Move() { if((cTransform.localScale.x > 0 && InputHorValue < 0) || (cTransform.localScale.x < 0 && InputHorValue > 0)) { Vector2 temp = cTransform.localScale; temp.x *= -1; cTransform.localScale = temp; } cRigidbody2D.velocity = new Vector2(moveSpeed * InputHorValue, cRigidbody2D.velocity.y); } void Jump() { if(canJump) { canJump = false; isGrounded = false; cRigidbody2D.AddForce(Vector2.up * jumpForce); } } void OnCollisionEnter2D(Collision2D col) { if(col.gameObject.tag == "Ground") isGrounded = true; } }

  • オブジェクト指向 継承について

    PHP初心者です。 オブジェクト指向を今勉強している途中でどうしても理解できないところがあるので教えてください。 ---------------------------------------------------------------- <? class ANIMAL{ var $first_weight; var $weight; var $soul = true; var $x = 0; var $y = 0; function ANIMAL($weight){ $this->first_weight = $this->weight = $weight; $this->old = $old; } function walk($x, $y){ if(!$this->soul){ return; } if($this->weight < $this->first_weight * 0.99){ $this->death(); return; } $this->x += $x; $this->y += $y; echo "walking... [{$x}], [{$y}]<br />"; $this->weight -= 20; } function death(){ $this->soul = false; echo "I died...<br />"; } function get_weight(){ echo "Weight... {$this->weight} g<br />"; } function get_posi(){ echo "Position... x : {$this->x}, y : {$this->y}"."<br />"; } } $animal = new ANIMAL(6000); $animal->walk(5, 2); $animal->walk(-10, 20); $animal->walk(2, 0); $animal->walk(-50, 21); $animal->walk(-11, -20); $animal->walk(20, 30); $animal->get_weight(); $animal->get_posi(); ---------------------------------------------------------------- 上記のようなプログラムがあります。 プログラムの答えの予想では、 >if($this->weight < $this->first_weight * 0.99){ 移動するごとに体重が20キロ減っていき 元体重の0.99%をきった時点5940になると   $animal->walk(2, 0); $animal->walk(-50, 21); $animal->walk(-11, -20); $animal->walk(20, 30); この部分は全て I died...になると考えていました。 また、$animal->get_weight();この部分は5000gと考えていました。 return;を入れることでなにが変わるのか、戻り値という事はわかり ます。本を読んでいて本の中の簡単な例題では意味はなんとなくつかめるのですが、どんな時につかったらいいのか、また複雑になるとreturn;の存在する意味がわからなくなってしまいます。 ご助言いただければ幸いです。宜しくお願いします。

    • ベストアンサー
    • PHP
  • UNITYでの埋め込みオブジェクト

    UNITYでアプリを作りました。 基本的には画像を使った2Dのアプリですが、 ビルドした際、素材として使用した画像などは どのような形式で保存されるのでしょうか。 画像抽出ソフトなどで抜き出されてしまうことを懸念しております。 ・UNITYでの素材保存の仕組み ・抽出の可否(こんなソフトが使われるなど、) ・抽出できなくする、保護するための方法 など、ご存知の方がおられましたら 教えて下さい。

専門家に質問してみよう