Question by
CodeLink · Jul 07, 2019 at 06:11 AM ·
movement2d-platformerteleportdoors
Activating a Script Causes Another to Activate
I'm trying to create a door system in my 2D game, and considering the similar actions needed to go into different doors, the scripts used are similar.
Here are the two scripts I'm using, both very similar, only changing references to the other door.
//Door2 to Door1
public class TPD2D1 : MonoBehaviour
{
private GameObject Player;
private GameObject exitDoor;
private Collider2D playerCollider;
private bool isTouching = false;
public float maxDistance = 1;
public bool canUse;
// Start is called before the first frame update
void Start()
{
Player = GameObject.FindGameObjectWithTag("Player");
exitDoor = GameObject.FindGameObjectWithTag("D1");
canUse = true;
playerCollider = Player.GetComponent<Collider2D>();
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(Player.transform.position, this.transform.position) < maxDistance)
{
isTouching = true; // they are touching AND close
}
else
{
isTouching = false;
}
if (isTouching == true)
{
OnColliderEnter2D(playerCollider);
}
}
void OnColliderEnter2D(Collider2D playerCollider)
{
if (Input.GetButtonDown("Vertical") && playerCollider.gameObject.tag == "Player")
{
Player.transform.position = exitDoor.transform.position;
canUse = false;
if (Input.GetButtonUp("Vertical"))
{
canUse = true;
}
print("D2D1 is called");
}
}
}
//Door 1 to Door 2
public class TPD1D2 : MonoBehaviour
{
private GameObject Player;
private GameObject exitDoor;
private Collider2D playerCollider;
private bool isTouching = false;
public float maxDistance = 1;
public bool canUse;
// Start is called before the first frame update
void Start()
{
Player = GameObject.FindGameObjectWithTag("Player");
exitDoor = GameObject.FindGameObjectWithTag("D2");
playerCollider = Player.GetComponent<Collider2D>();
canUse = true;
}
// Update is called once per frame
void Update()
{
if (Vector3.Distance(Player.transform.position, this.transform.position) < maxDistance)
{
isTouching = true; // they are touching AND close
}
else
{
isTouching = false;
}
if (isTouching == true)
{
OnColliderEnter2D(playerCollider);
}
}
void OnColliderEnter2D(Collider2D playerCollider)
{
if (Input.GetButtonDown("Vertical") && playerCollider.gameObject.tag == "Player")
{
Player.transform.position = exitDoor.transform.position;
canUse = false;
if(Input.GetButtonUp("Vertical"))
{
canUse = true;
}
print("D1D2 is called");
}
}
}
When running this, the code for Door1 to Door2 works fine, but when I enter Door2 to get to Door1, my console displays that I've entered Door2 to Door1, then back out through Door1 to Door2. It effectively undoes the action. Any help would be appreciated!
Comment