Recognizing a specific objects collision in Unity - unity3d

I've been trying to figure out how to detect collision to make a simple combat system, but the commands aren't returning what I want them too. What I'm using right now (in the unity engine):
using UnityEngine;
public class swordDetect : MonoBehaviour
{
void OnCollisionEnter(UnityEngine.Collision CollisionInfo)
{
if (CollisionInfo.gameObject.name == "swordCollide")
{
Debug.Log("it work again");
}
}
}
This isn't returning anything, and its attached to a rock that I've been using to test it.
The swordCollide object is attached to the players sword, but nothing happens when it collides with the rock.

Make sure that your Gameobject has a collider on it, which is not set to Trigger (because then it can't receive collision, but will only trigger). I would always rather tag my Gameobjects and check for the tag than for the name, because it is less error prone. If the colliding Gameobject is a Trigger, you need to check
private void OnTriggerEnter(Collider other){}
Best watch the Unity tutorials about collision https://unity3d.com/learn/tutorials/topics/physics/colliders?playlist=17120
and check the documentation https://docs.unity3d.com/ScriptReference/Collider.html
Both are easy to understand and go with some sample code

Related

How do I use OnTriggerEnter() on a non-moving object?

I'm a new to game developing, and I'm making my first game in Unity, which is a top-down, 2D survival type game. In order to detect when the player hits a tree or other world object, I added invisible triggers on each side of the player, which I set active whenever you click. Whenever either the player or the target is moving, this system works perfectly, however, when the target is not moving, like a tree, the collision is not detected. I figure that the OnTriggerEnter function only works when a moving object collides with the trigger, however, I have no idea how to do it otherwise. Is there another function I can use, or some way I can fix this?
void OnTriggerEnter2D(Collider2D other)
{
Debug.Log("hit");
if (other.gameObject.tag == "Tree")
{
Debug.Log("hit tree");
other.gameObject.GetComponent<TreeScript>().treeHealth--;
}
}
You can try the:
private void OnCollisionEnter2D(Collision2D col)
{
}
If 2 objects collide with each other without using the "Trigger" option, the OnCollisionEnter2D will be called.
A quick example where to use the 2 different methods are as follow:
Use the OnTriggerEnter2D() method in a racing game where you want to detect when a car goes through the finish line and you want to use a trigger because you don't actually care for the collision.
Use the OnCollisionEnter2D method to detect when 2 cars collide with each other and you don't want the 2 object to go through each other.

I'm trying to get the Debug.Log to detect a collision when I bring two objects together

When I put this script into the object, a cube, it does not register the platform it hits beneath when I make the gameObject the platform. I'm trying to get the two objects to detect collision between each other but it does not seem to work. Neither objects are trigger checked in the Box Colliders. The cube has a rigid body with gravity checked but the platform does not. This is a 3D game.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Collision : MonoBehaviour
{
public Transform gameObject;
void onCollisionEnter(Collision col)
{
if (col.gameObject);
{
Debug.Log("Yes");
}
}
}
As Sven Viking already said, you have to change the syntax from onCollisionEnter to OnCollision enter. Also, let's take a look at your logic:
You want to check that, if your cube object collides with another object, and if that object is the same as the one you're referencing, you want to see a log of that in your console. Currently, however, you're asking for something else.
First of all, your platform is not stored as a gameObject, it's stored as a Transform. Those two are different things, the Transform stores the position/rotation/scale of an object, while 'GameObject' is the entire object, includng its Transform. Also, you named your variable gameObject, which you should never do - Never name variables with the same name as existing elements.
'col' represents the collision. col.gameObject is the gameObject of that collision. There's no logic demanded there. You're just making a reference. What you want, instead, is compare the gameObject of the collision with your referenced gameObject(the platform) and, if both of them are the same, then you can proceed. Therefore, what you want is:
public class CollisionScript : MonoBehaviour
{
public GameObject platform;
void OnCollisionEnter(Collision col)
{
if (col.gameObject == platform);
{
Debug.Log("Yes");
}
}
}
Let me know if this solves your problem.
EDIT: I see now you also named your class 'Collision', which I'm pretty sure would break things, as Collision is already a class within Unity(you can check that looking at "Collision col", that indicates there is a class named Collision). You should change both the class name on the top of the script and the file name to reflect that change.

Collision not being detected Unity2D

I am trying to make an object that upon collision with another object, gets destroyed. I have also used Debug.Log and it turns out that the collision is not even detected. Here is the code
public class Enemy_1 : MonoBehaviour
{
public void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.tag.Equals ("AttackArea"))
{
Destroy(gameObject);
}
}
}
Welcome to the community!
To allow us better to understand the context, next time provide some inspector screenshots of these objects. It will be easier for both of us! 😋
Now, for your problem, there might be one (or combination) of few reasons:
None of the two objects have Rigidbody2D attached. For collision to be detected, at least one of two must be a Rigidbody2D. ...
Other object is not tagged as AttackArea. Thus, tag equation returns false. ...
Other object's collider is marked as is trigger. In this case OnTriggerEnter2D(Collider2D) is called instead of OnCollisionEnter2D(Collision2D).
Check for each of these and let us know! 😉

how to get variables from a script my player is colliding with?

so i have my player standing next to a cube. the player has a script, which is empty aside from an int which is 43. the same applies to the cube except the int in the cube's script is 42. how do i get(or detect) the int in the cube's script and print it in the console using OnCollisionEnter(or OnTriggerEnter if it is better) like this: ("the cube has the number 42")?
Well you should definitely go through some tutorials before continuing since you don't seem to know even very basic stuff, but to at least point you in the right direction, you would do something like this (assuming C#, not UnityScript):
void OnCollisionEnter(Collision collision)
{
int numberOfCollidedObject = collision.gameObject.GetComponent<objectsScriptNameHere>().variableNameHere;
Debug.Log(numberOfCollidedObject);
}
How did I know how to do that? I looked at the documentation. I can see that when OnCollisionEnter is called it's passed a variable of type Collision. It's hyperlinked in the documentation, so I clicked on Collision and found that it contains a variable called gameObject that contains a reference to the game object of the collider we just hit. I happen to know that to get into another script, you called GetComponent<scriptName>(), and from there any public variables and functions can be accessed.
if you got two collider (player and object who collide the player) you can convex the collider and set isTrigger to true
Then call the function OnTriggerEnter()
void OnTriggerEnter(Collider other) {
Debug.Log(other.name);
}

How do I detect collision with a child of a prefab

I've started studying Unity and decided to do some practice. So, I thought that it would be awesome to develope "Flappy Bird" as an experiment. But I've faced with the problem. You know, when you fly between pipes, you earn a point. To do that I made a prefab with two pipes and an empty game object (trigger) between them to detect collision with it. But when I call OnCollisionEnter2D method, it detects collision with a prefab, not with the trigger or pipes in it. Could you help me? How do I detect collision with a child of a prefab?
like what Uri Popov answered, use OnTriggerEnter2D() there are several points you need to do :
1. Put the OnTriggerEnter2D() Script on your empty game object, and don't forget to attached collider2D on your empty object.
2. make sure isTrigger checked in collider2D option
3. also make sure your player has tag, you can make the tag your own, in this example i give "Player" tag to my player game object
4. the example script(i tired it and worked)
public class YourTriggerScript: MonoBehaviour {
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnTriggerEnter2D(Collider2D collider)
{
if (collider.GetComponent<Collider2D>().tag == "Player")
{
Debug.Log ("Collided");
// do something or you can + your point here
}
}
}
Hope it helped you
if your collider is marked as a Trigger you should use OnTriggerEnter2D().