2016-08-08 15 views
2

Ich habe einen Schrank mit 2 Colliders - eine für Schrank und eine für seine Box. Wenn ich auf die Box drücke, möchte ich sie öffnen/schließen. Es hat gut funktioniert, aber aus irgendeinem Grund funktioniert es nur, wenn ich auf den Rand der Box drücke. Wenn Sie auf die Mitte klicken, funktioniert es nicht.Box Collider fängt keine Maus drücken drücken Ereignis

Video: https://youtu.be/OozsAi7KNzs

Hier ist der Code, die Animation spielt (Öffnen/Schließen Schrank), wenn ich auf dem Feld drücken:

public Animation[] animations; 
public string[] animationName; 
public bool playOneDirection; // should revert animation speed after second playing? 
public AudioSource myAudioOpen; 
public AudioSource myAudioClose; 

private bool isDoorClosed; 
private bool isAimationReadyToPlay = true; 
private Collider thisCollider; 

public void Start() 
{ 
    thisCollider = GetComponent<Collider>(); 
} 

void Update() 
{ 
    if (Input.GetButton("Fire1")) 
     if(DoPlayerLookAtButton() && isAimationReadyToPlay) 
      OpenCloseDoor(); 
} 

bool DoPlayerLookAtButton() 
{ 
    RaycastHit _hit; 
    Ray _ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0)); 
    bool isHit = Physics.Raycast(_ray, out _hit, 1.5f); 

    if (isHit && _hit.collider == thisCollider) return true; 
    else return false; 
} 

public void OpenCloseDoor() 
{ 
    if (!isDoorClosed) // Play animation with normal speed 
    { 
     myAudioOpen.Play(); 
     for (int i = 0; i < animations.Length; i++) 
     { 
      animations[i][animationName[i]].speed = 1.0f; 
      animations[i].Play(); 
     } 
    } 

    if(playOneDirection) 
     return; 

    if (isDoorClosed) // Play animation with revert speed 
    { 
     myAudioClose.Play(); 
     for (int i = 0; i < animations.Length; i++) 
     { 
      animations[i][animationName[i]].speed = -1.0f; 
      animations[i][animationName[i]].time = animations[i][animationName[i]].length; 
      animations[i].Play(); 
     } 
    } 

    StartCoroutine("DelayBetweenAnimations"); 
    isDoorClosed = !isDoorClosed; 
} 

IEnumerator DelayBetweenAnimations() 
{ 
    isAimationReadyToPlay = false; 
    yield return new WaitForSeconds(0.5f); 
    isAimationReadyToPlay = true; 
} 
+1

Es ist wirklich schwer zu sagen, was das Problem verursacht. Ich habe wenige Ideen. 1. Ein anderer Collider ist unterwegs. 2. Kamera-schneidende Flugzeuge schneiden den Collider? Der letzte bin ich mir nicht sicher, dass es möglich ist. –

Antwort

1

Ihr Schrank hat 2 Beschleuniger, aber Sie sind nur nach einem von ihnen suchen. Wenn es irgendeine Art von Überlappung gibt, dann könnte es fummelig sein, auf die richtige zu klicken. Wenn Sie nur in der Lage sein wollen, überall auf dem Spielobjekt klicken, um Ihren Code zu ändern, wie so ...

//From 
//if (isHit && _hit.collider == thisCollider) return true; 
//To 
if (isHit && _hit.transform.gameObject == this.gameObject) return true; 

eine Ebenenmaske für Ihren Player hinzufügen und Ihre Physics.Raycast gewährleisten ausschließt, dass die Schicht, die Besetzung zu vermeiden sich selbst schlagen. See here

0

Ich habe die Hauptkamera von der Mitte des Players aus gemacht, also trifft Raycast den Collider des Spielers. Ich habe versucht, den Fehler zu beheben, wenn die Kamera wie auf dem Bildschirm unten durch die Wand gehen kann.

Raycast kann, die durch den Spieler zu sehen und erreichte nicht die Box enter image description here

+1

Werfen Sie einen Blick auf meine Antwort, es enthält eine Lösung für das unten –