2017-08-13 5 views
0

私はもっとも不思議な問題が発生しています レイキャストがあり、特定のレイヤーに触れると小さなアニメーションを実行する機能が呼び出されます。スクリプトコードがプリフェッチの1つのインスタンスでのみ動作するようです

問題は、これは1つのオブジェクトでしか動作しません。プレハブを複製したり、プレハブをシーンにドラッグしたり、動作しません。

今、私は以下のコードを持っている、とあなたが見ることができるように私は私が単一の項目をドラッグした場合ので、私は、私が気づいたplatfall.startFall();

何かを呼び出すことができ、私はpublic PlatformFall platfall;でスクリプトにアクセスすることができ、このラインを持っていますInspectorの階層構造からパブリックPlatFallに渡すと、SINGLEオブジェクトは正常に動作します。 (startFallが呼び出されたときにアニメートされます)。しかし、私がプロジェクトから検査官にプレハブをドラッグすると、動作しません。 (たとえデバッグログに、メソッドがアニメーションと呼ばれることが示されても、発生しません)。

public class CharacterController2D : MonoBehaviour { 
    //JummpRay Cast 
    public PlatformFall platfall; 
    // LayerMask to determine what is considered ground for the player 
    public LayerMask whatIsGround; 
    public LayerMask WhatIsFallingPlatform; 

    // Transform just below feet for checking if player is grounded 
    public Transform groundCheck; 

    /*.... 
    ...*/ 
    Update(){ 
     // Ray Casting to Fallingplatform 

     isFallingPlatform = Physics2D.Linecast(_transform.position, groundCheck.position, WhatIsFallingPlatform); 
     if (isFallingPlatform) 
     { 
      Debug.Log("Here"); 
      platfall.startFall(); 
     } 
     Debug.Log(isFallingPlatform); 
    } 
} 

プラットフォームスクリプト

using System.Collections; 
using System.Collections.Generic; 
using UnityEngine; 


public class PlatformFall : MonoBehaviour 
{ 

    public float fallDelay = 0.5f; 

    Animator anim; 

    Rigidbody2D rb2d; 

    void Awake() 
    { 
     Debug.Log("Awake Called"); 
     anim = GetComponent<Animator>(); 
     rb2d = GetComponent<Rigidbody2D>(); 
    } 

    private void Start() 
    { 
     Debug.Log("Start Called"); 
    } 

    //void OnCollisionEnter2D(Collision2D other) 
    //{ 
    // Debug.Log(other.gameObject.tag); 
    // GameObject childObject = other.collider.gameObject; 
    // Debug.Log(childObject); 
    // if (other.gameObject.CompareTag("Feet")) 
    // { 
    //  anim.SetTrigger("PlatformShake"); 

    //  Invoke("Fall", fallDelay); 

    //  destroy the Log 
    //  DestroyObject(this.gameObject, 4); 
    // } 
    //} 

    public void startFall() 
    { 


      anim.SetTrigger("PlatformShake"); 



    Invoke("Fall", fallDelay); 
     Debug.Log("Fall Invoked"); 
     // destroy the Log 
    //  DestroyObject(this.gameObject, 4); 

    } 

    void Fall() 
    { 
     rb2d.isKinematic = false; 
     rb2d.mass = 15; 
    } 
} 

答えて

1

私はあなたが常にインスペクタから割り当てられたPlatformFallインスタンスを呼び出しているあなたのポストからわかります。私はこの変更があなたの問題を解決すると思います。

public class CharacterController2D : MonoBehaviour { 
    private PlatformFall platfall; 
    private RaycastHit2D isFallingPlatform; 

    void FixedUpdate(){ 
     isFallingPlatform = Physics2D.Linecast(_transform.position, groundCheck.position, WhatIsFallingPlatform); 
     if (isFallingPlatform) 
     { 
      Debug.Log("Here"); 
      platfall = isFallingPlatform.transform.GetComponent<PlatformFall>(); 
      platfall.startFall(); 
     } 
    } 
} 

ところで、プレハブをキャストするのに適切な位置に置いたと仮定します。もう一つのことは、FixedUpdateで剛体に影響を与える物理演算を行うべきです。

+0

完璧に動作します、私のエラーは何ですか?私はFixedUpdateでそれをやっていなかったので? –

+0

いいえ、あなたのコードは、インスペクタから割り当てられた同じPlatformFallインスタンスを呼び出します。現在は、hittedオブジェクトのPlatformFallコンポーネントを使用しています。 – OsmanSenol

関連する問題