Need help getting my door to open and close without triggering other doors.
The script works fine to open/close the door when I press "E". It also works in that I have to be a certain distance from the door and looking at it. The problem I'm having is that the other doors in my scene with similar scripts all open/close whenever any of them is interacted with:
using UnityEngine; using System.Collections;
public class GeneralDoor : MonoBehaviour { // Use this for initialization public Animation anim; bool open; Ray ray; RaycastHit hit; public float distance = 8.0f;
void Start () {
anim = GetComponent<Animation> ();
anim ["GenDoorOpen"].speed = -1.0f;
open = true;
}
// Update is called once per frame
void Update ()
{
if (Input.GetKeyDown(KeyCode.E)) {
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast (ray, out hit, distance)) {
if (!anim.isPlaying) {
open = !open;
anim ["GenDoorOpen"].speed = anim ["GenDoorOpen"].speed * -1.0f;
if (open) {
anim ["GenDoorOpen"].time = anim ["GenDoorOpen"].length;
} else {
anim ["GenDoorOpen"].time = 0.0f;
}
} else {
open = !open;
anim ["GenDoorOpen"].speed = anim ["GenDoorOpen"].speed * -1.0f;
}
anim.Play ("GenDoorOpen");
}
}
}
}
Let me know if you see something I don't... Thanks is advance.
Answer by tanoshimi · Oct 27, 2016 at 06:57 AM
Nowhere in your script do you test which door your mouse cursor is over. All your doors just test "has the player pressed E" (line 10) and "does a raycast from the mouse cursor hit something" (line 12).
You need to play the animation on the gameobject only if the raycast hits the gameobject to which this script is attached.
I see... How could I specifically go about calling only one door to play the animation?
I don't know if you really want to stick with animations, but if you're open to other solutions, this asset I created uses a physics-based approach:
And for your issue, you need to specify I think using 'hit.transform.gameObject'
I tried this:
// Update is called once per frame
void Update ()
{
if (Input.Get$$anonymous$$eyDown($$anonymous$$eyCode.E)) {
ray = Camera.main.ScreenPointToRay(Input.mousePosition);
if (Physics.Raycast (ray, out hit, distance)) {
if (hit.transform.gameObject.tag == "door") {
currentDoor = hit.collider.gameObject;
anim = currentDoor.GetComponent<Animation> ();
if (!anim.isPlaying) {
open = !open;
anim ["GenDoorOpen"].speed = anim ["GenDoorOpen"].speed * -1.0f;
if (open) {
anim ["GenDoorOpen"].time = anim ["GenDoorOpen"].length;
} else {
anim ["GenDoorOpen"].time = 0.0f;
}
} else {
open = !open;
anim ["GenDoorOpen"].speed = anim ["GenDoorOpen"].speed * -1.0f;
}
anim.Play ("GenDoorOpen");
}
}
}
}
}
I made sure to tag the door as 'door' but now my animation won't play at all. Although, the other doors in the scene with the old script are still being triggered XD...
@alexanderameye I'll definitely take a look at you asset too :)
Your answer
Follow this Question
Related Questions
Open Door Animation Problem 0 Answers
Open/Close Door only if player is near the Door 1 Answer
Door open/close sound effect?? 0 Answers
Help: My doors won't work properly >< 0 Answers
How would I make a close/open button that opens/close the menu? 1 Answer