Can we do something like that?

GameObject.OnCollisionEnter(Collision col)
{
          //code
}

It is just hypothetical code. I didn’t try this.

I don’t understand. Are you looking for this Unity - Scripting API: Collider.OnCollisionEnter(Collision) ?

There is a collider attached to aGameObject. I want to call OnCollisionEnter from a script that is not attached to that gameobject. Can we do something like:

aGameObject.OnCollisionEnter(Collision col )
{
        //code
}

Or there is another method to do so.
Well, I think it is not valid but what if someone know a way to do so.

You should probably take a look at the Unity scripting tutorials.

OnCollisionEnter is called for every MonoBehaviour class on the rigidbody that collided. If you want to call OnCollisionEnter yourself then that’s probably because of a problem with your design. Very rarely do you need to call MonoBehaviour functions like that (occasionally you might when you’re doing fancy stuff with inheritance etc).

Why exactly do you need to do this?

I was just thinking. May be I will use it in near future.

For situations like these you can create and use events.

using UnityEngine;
using System;

public class ObjectThatCollides : MonoBehaviour
{
    //Action is in System namespace so it needs -> using System;
    public Action<ObjectThatCollides, Collision> OnCollisionEnterEvent;

    void OnCollisionEnter(Collision collision)
    {
        if (OnCollisionEnterEvent != null)
            OnCollisionEnterEvent.Invoke(this, collision);
    }
}
using UnityEngine;

public class ObjectThatReceivesTheCollisionEvent : MonoBehaviour
{
    public ObjectThatCollides receiveCollisionEventsFrom;

    public void Awake()
    {
        receiveCollisionEventsFrom.OnCollisionEnterEvent += CollisionEventReceived;
       //To unsubscribe from event you can use
       //receiveCollisionEventsFrom.OnCollisionEnterEvent -= CollisionEventReceived;
    }

    void CollisionEventReceived(ObjectThatCollides from, Collision collision)
    {
        Debug.Log("<color=blue>["+ from.name + "]</color> collided with <color=blue>[" + collision.collider.name + "]</color>" );
    }
}

Events have many uses in Game Development so it’s good to know them well. Unity also offers UnityEvents which can be handy as you can bind them from the editor, but to take use of that they can’t have any parameters.

using UnityEngine;
using UnityEngine.Events;

public class ObjectThatCollides : MonoBehaviour
{
    public UnityEvent CollisionEvent;
    void OnCollisionEnter(Collision collision)
    {
        CollisionEvent.Invoke();
    }
}
using UnityEngine;
using UnityEngine.Events;

public class ObjectThatCollides : MonoBehaviour
{
    public UnityEvent CollisionEvent; //visible in inspector
    public UnityEvent<ObjectThatCollides, Collision> CollisionEventWithParameters; //not visible in inspector
    void OnCollisionEnter(Collision collision)
    {
        CollisionEvent.Invoke();
        CollisionEventWithParameters.Invoke(this, collision);
    }
}

Wow… Thanks :smiling_face: