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);
}
Related
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.
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.
I am a newbie in Unity and game development. I want to make a mobile stack jump game with primitives. I have a player in the center of the screen. The enemy is approaching the player from the right and left of the screen. The player tries to sit on the enemy by jumping as in Mario Game. If the enemy hits the player from the side, the game is over. I create enemies with a SpawnMan. There is a prefab for an enemy game object. SpawnMan creates them at certain time intervals with the Instantiate() method. I want to store data on whether the enemy is approaching from right or left. I even want to store this information by creating an enum type. In summary, I want to have enemy objects with the left and the right types. How do I set this property (left enemy or right enemy) when calling the Instantiate() method in SpawnMan as in OOP constructor with parameters.
enum EnemyType
{
Left,
Right
}
// ...
Instantiate(enemyPrefab(EnemyType.Left), spawnPos, enemyPrefab.transform.rotation);
Assign a GameObject while instantiating first :
GameObject enemy1 = Instantiate(...)
Then, we can use the player transform and the enemy transform vectors to get a direction (+ value and a minus value)?
As Chandradhar said, addition to that, you can use Mathf.Sign(player.position.x- enemy.position.x); to see if the enemy comes from the left or the right of the player.
You can't really pass it in exactly that way, as Instantiate doesn't call a constructor on the instantiated prefab's scripts. Or I guess enemyPrefab could be a method that returns an actual prefab object with set script values, but that would be a somewhat odd way to get what you want.
But presumably you just want the enemy object to have that information about left/right, in that case the easiest would be to get the attached script and then assign the left/right property. So you would add something like this to your enemy script (the one that is attached to enemy prefab)
public class MyEnemyScript : MonoBehaviour
{
public EnemyType Type;
... your enemy code here...
}
And then use it like that:
var enemyGameObj = Instantiate(enemyPrefab, spawnPos, enemyPrefab.transform.rotation);
enemyGameObj.GetComponent<MyEnemyScript>().Type = EnemyType.Left;
Note that this is not really good practice, as GetComponent is an expensive call, but then again neither is Instantiating all those enemies - it would be nicer to use pooling.
I'm assuming an enum for left and right is overkill, but if you have some design reason that the enemies need to do have some special logic depending on what side they're on, you can still handle that in a simpler fashion.
In your MyEnemyScript(), you have Awake() and OnEnable() methods that will be automatically called by Unity just like Start and Update. In one of them (use OnEnable if you use object pooling), put something like this:
public EnemyType type;
private void Awake()
{
if (transform.position.x > PlayerInfo.playerPosition.x)
type = EnemyType.right;
else
type = EnemyType.left;
}
Now you can just spawn enemies as normal without thinking about it. PlayerInfo can be a static class or a singleton or however you prefer making that information available.
Then in your update loop, just have two logic paths (which I assume is similar to what you're doing anyway).
private void Update()
{
if(type = EnemyType.left)
//do left enemy stuff
else
//do right enemy stuff
}
I am working on a game and came to a point where I had nothing in my mind. want to take reference of an object by collider frequently. I don't know how to make so please help.
Thanks in advance
Take Object A with script As and script 2As and collider Ac
Object B with script Bs and collider Ac
Their might be 3 different things you are looking to achieve here:
Reference Script Bs from script As:
First you need to reference the Game Object that Bs is on (B) from script As
At the very top of script As you would add:
public GameObject objectB;
Then later in your code when you want to reference the script on objectB you can do:
int value = objectB.GetComponent<Bs>().score;
Where score is a variable in Bs
Reference Script 2As from As:
In this case we already are on the same gameobject so we can simply do
int value = gameObject.GetComponent<2As>().Score;
Where Score is a integer in the Script 2As
The reason we can just say gameObject.GetComponent here instead of having to reference the other object is because gameObject with a lower case g refers the object that the script is sitting on. So effectively we just say "get the other script on this gameobject"
Lastly (I think you are trying to do this maybe?)
Take a collider and get the GameObject on this collider then get the script on that GameObject:
public Collider coll;
int val = coll.GameObject.GetComponent<script>().value;|
I hope that helps, I didn't really understand your question so if this doesn't answer your question let me know :)
Also join my discord if you have any other questions: discord.io/gamedev
We really need more info about what you're trying to accomplish. Are you trying to know what an object collided with recently? trying to raycast? Depending on what you want to do with it, you might need to reference different components on the gameobject. etc.
But here's an example:
//Component on a gameobject with a collider attached.
public class RefByCollision : MonoBehaviour
{
[SerializeField] //makes it show in inspector
private GameObject lastCollisionGO;
//Called everytime this gameobject collides with another that has a collider (non trigger)
private void OnCollisionEnter(Collision other)
{
lastCollisionGO = other.gameObject; //replaces reference with the newly collided object.
}
}
This component on a gameobject with a collider attached will replace the reference stored in lastCollisionGO everytime the object collides with another object.
Note: If you try to query the value of lastCollisionGO before it collides with something, it will be empty and give you a null reference exception.
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().