void OnCollisionEnter2D (Collision2D collision){
//I want access this -------↑ from another script,How to do it?
}
void OnCollisionEnter2D (Collision2D collision){
//I want access this -------↑ from another script,How to do it?
}
You’ll set an identifier and expose it either by setting its access modifier public, or encapsulating it in a property and exposing it that way.
Field using public access:
using UnityEngine;
public class ExampleClass : MonoBehaviour {
public Collision2D m_collision;
void OnCollisionEnter(Collision2D collision) {
m_collision = collision;
}
}
Property example:
using UnityEngine;
public class ExampleClass : MonoBehaviour {
private Collision2D m_collision = null;
void OnCollisionEnter(Collision2D collision) {
m_collision = collision;
}
public Collision2D MyCollision { get { return m_collision; } }
}
In the other class, you’ll have to get a reference to ExampleClass in this case in order to access the identifier:
using UnityEngine;
public class SomeOtherExampleClass : MonoBehaviour {
void Start() {
// From the public field access
if (FindObjectOfType<ExampleClass>().m_collision)
Debug.Log(FindObjectOfType<ExampleClass>().m_collision);
else
Debug.Log("Collision data was null");
// From the property access
if (FindObjectOfType<ExampleClass>().MyCollision)
Debug.Log(FindObjectOfType<ExampleClass>().MyCollision);
else
Debug.Log("Collision data was null");
}
}
The search method is up to you, depending on how you have your hierarchy set up. FindObjectOfType<T>
is rather expensive. GetComponent<T>
is less so, GetComponentInChildren<T>
is marginally slower than GetComponent<T>
, etc. I can’t remember if a Collision object can be assigned a null value. If it can’t, initialize it as a new Collision object and in the conditional, check for MyCollision or m_collision being equal to a new Collision object if the script you have OnCollision2D hasn’t run yet.