- Home /
Question by
MrToad · Jun 01, 2015 at 05:36 PM ·
triggercollider2d
OnTriggerEnter2D working but OnTriggerExit2D never called
My code looks like this :
private bool itemTrigger;
private GameObject triggerOther;
private void Update () {
if (!GameManager.instance.playersTurn)
return;
int horizontal = 0;
int vertical = 0;
horizontal = (int)(Input.GetAxisRaw ("Horizontal"));
vertical = (int)(Input.GetAxisRaw ("Vertical"));
if (horizontal != 0)
{
vertical = 0;
}
if (horizontal != 0 || vertical != 0)
{
AttemptMove<Block> (horizontal, vertical);
}
if (Input.GetKeyDown(KeyCode.E))
{
if (itemTrigger == true)
{
if (inventory.AddItem(triggerOther.GetComponent<ItemScript>()))
{ triggerOther.gameObject.SetActive(false); }
}
}
}
private void OnTriggerEnter2D (Collider2D other)
{
if (other.tag == "Item")
{
Debug.Log("Enter");
triggerOther = other.gameObject;
itemTrigger = true;
}
}
private void OnTriggerExit2D(Collider2D other)
{
if (other.tag == "Item")
{
Debug.Log("Exit");
itemTrigger = false;
}
}
When standing on an item, I can pick it up by pressing "E"... But OnTriggerExit is never called so even if I leave my item collider, i can still pick it up...
My game is based on the Rogue-like tutorial so my MovingObjects script looks like this
public float moveTime = 0.5f;
public LayerMask blockingLayer;
private BoxCollider2D boxCollider;
private Rigidbody2D rb2D;
private float inverseMoveTime;
// Use this for initialization
protected virtual void Start ()
{
boxCollider = GetComponent <BoxCollider2D> ();
rb2D = GetComponent <Rigidbody2D> ();
inverseMoveTime = 1f / moveTime;
}
protected bool Move (int xDir, int yDir, out RaycastHit2D hit)
{
Vector2 start = transform.position;
Vector2 end = start + new Vector2 (xDir, yDir);
boxCollider.enabled = false;
hit = Physics2D.Linecast(start, end, blockingLayer);
boxCollider.enabled = true;
if (hit.transform == null)
{
StartCoroutine(SmoothMovement(end));
return true;
}
return false;
}
protected IEnumerator SmoothMovement (Vector3 end)
{
float sqrRemainingDistance = (transform.position = end).sqrMagnitude;
while (sqrRemainingDistance > float.Epsilon)
{
Vector3 newPosition = Vector3.MoveTowards (rb2D.position, end, inverseMoveTime * Time.deltaTime);
rb2D.MovePosition (newPosition);
sqrRemainingDistance = (transform.position - end).sqrMagnitude;
yield return null;
}
}
protected virtual void AttemptMove <T> (int xDir, int yDir)
where T : Component
{
RaycastHit2D hit;
bool canMove = Move (xDir, yDir, out hit);
if (hit.transform == null)
return;
T hitComponent = hit.transform.GetComponent<T>();
if (!canMove && hitComponent != null)
{
OnCantMove (hitComponent);
}
}
protected abstract void OnCantMove <T> (T component)
where T : Component;
}
Comment
Your answer