I am making game and I am using sword as a weapon so I have created a script and detect hit by collider of sword to deal damage but I am getting problem that it is dealing damage whenever sword collide with enemy collider even if player is not in state of attacking suggest me a script for melee attack damage
You should provide more code / resources for us to properly evaluate the issue. Although, I think I get what your problem is. You should disable the collider when the character is not attack. This will stop any accidental triggers happening when not in combat.
Related
My problem looks like this:
I have one stationary object wall and second object that is moving projectile. I want projectile to stop when it collides with wall. But ewery my attempt ended with projectile passing through wall.
Only script that affects movement of projectile:
public Transform trans;
void Update()
{
trans.Translate(0, 0, speed * Time.deltaTime, Space.Self);
}
All compomponents of projectile:
All components of wall:
Note: I have correctly set up layers in project settings.
I have tried many combinations of rigit boddies, colliders, layers and so on, but projectile always passed through wall.
In general, your presented setup is right. The contacting object have a Rigidbody component, and the objects you can collide have at least a collider (not a trigger).
First possible problem: your Rigidbody is set to Kinematic. Did you enable all collision modes in Project Settings > Physics > Contact Pairs Mode?
Second problem is the use of transform.Translate in the Update. Translate will ignore physic and just move the object when you tell it to do, and Update may be out of sync with the physic loop, where it would be recommended to use FixedUpdate. Even using FixedUpdate, Translate will not do the right job. It will force the object to move and the physic can complain or not about that (it can move the object back, glitching, or it can just ignore and let the object pass).
The right way to move a Kinematic rigidbody is through rigidbody.MovePosition, as stated in the Unity docs. For non-kinematic objects, you can use AddForce. Some tutorials also teach to set velocity of Rigidbody, which is not recommended because it can have undesired effects. Do it if you know the side effects and really want them.
I had a similar issue before. May I suggest destroying the projectile instead? You will then have to use OnCollisionEnter().
First, create a script and attach it to your projectile game object. After that, give your wall a tag, like 'wall'. Then, do something like this:
void OnCollisionEnter(Collision collision)
{
// Gets information about the game object the projectile collided with
GameObject objectCollided = collision.gameObject;
if (objectCollided.tag == "wall'){
// Do something with either the wall/enemy
}
// Destroy the projectile
Destroy(gameObject);
}
Note: If the intent was not to destroy the projectile but rather sticking to the wall, I suggest you to use detect collision using Raycast. Raycast has a hitInfo parameter and stores information about a gameObject that it hit, as well as the where did the Ray hit the gameObject.
Thus you can use this to move your projectile accordingly. In my previous projects, I used the Rigidbody component of my projectile and used .AddForce() to shoot it out, then detect collision with OnCollisionEnter().
Maybe you could do the same, but have a separate function to remove that force on entering a collision. I never tried it so I do not know if it will work.
Transform.Translate overrides the physics engine of unity. If you want to take advantage of the rigidbody and collider components of your gameObjects, you need to use rigidbody.Velocity or (as unity recommends in the docs) rigidbody.AddForce, and make sure you set IsKinematic to False on both rigidbodies, so that they can interact with one another physically.
In my Scene i have three enemies spawned at a point when player comes in their range they start attacking but the problem is all three enemies are attacking player at the same time. I want that when an enemy attack player other 2 must wait until first one is finished or enemy attack player alternatively
One way is to assigning a boolean to the player, isUnderAttack. When an enemy tries to engage the player, check if the player is under attack, if it is true, stop the attack, if false, go ahead and attack. You can define any type of behavior for queued enemies.
Thank you in advance for any input.
What is essentially happening is this: When the player shoots, the scene resets
What I interpret as happening:
Player shoots a laser beam
Laserbeam prefab collides immediately with player (so far as I can tell)
SceneManager resets scene
I suspect two possible causes:
Either the origin of my laserbeam is causing the created projectilePrefab to trigger the player's collision in this piece of code:
private void OnCollisionEnter2D(Collision2D collision)
{
SceneManager.LoadScene(0);
//if collider is projectile.Prefab, don't run this piece of code
}
More generally that my laserbeam collision doesn't exclude the player gameobject:
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
var projectile = Instantiate(
projectilePrefab,
transform.position,
projectilePrefab.transform.rotation);
}
}
The typical solutions then would likely look like this:
Ensure the laserbeam spawns away from the player, so they do not collide.
or, ideally,
The collider on my player would be able to simply exclude contact with a laserbeam as cause for SceneManager to reset the scene.
Where I get stuck when it comes to testing these solutions is the exact syntax. I was hoping someone might be willing to give some insight that is adept at conditional statements and the like. I'm still super new, so while I can largely comprehend what I'm reading and being shown, I'm still stuck before that hump of really being able to dissect it all myself.
Essentially what my ideal might look like (so far as I can tell) is: "If collider is projectilePrefab, do not run SceneManager.LoadScene"
Cheers and thank you in advance!
As the title suggests, I've literally just started learning Unity recently and I'm practising by making a side scrolling shooter. I've been following a Udemy course about it and (to my knowledge) I've been following the tutor's instructions to the letter, but at the point where he tests his and it works fine, by projectiles go straight through my enemies.
I'm a bit stumped at this point and so I thought I'd post here to see what you guys thought. I bet it's something really simple I've not done.
Please see my projectile code below:
using UnityEngine; using System.Collections;
public class DestroyEnemyAndProjectile : MonoBehaviour {
public GameObject WhiteExplosion;
public GameObject OrangeExplosion;
void Start()
{
}
void Update()
{
}
void OnCollisionEnter2D (Collision2D tempCollision)
{
if (tempCollision.gameObject.tag == "Collision")
{
spawnParticles(tempCollision.transform.position);
Destroy(tempCollision.gameObject);
}
}
void spawnParticles(Vector2 tempPosition)
{
Instantiate(WhiteExplosion, tempPosition, Quaternion.identity);
Instantiate(OrangeExplosion, tempPosition, Quaternion.identity);
}
}
Thanks for your help!
I did post a question to them which got a response, they suggested that perhaps the projectile is going too fast and check there was a Rigidbody 2D attached - both of which were already collect
make sure that the object you're colliding with has the tag "Collision", with the same capitalisation.
If it's not, you can do this by:
1. Selecting the GameObject to be collided with
2. In the top-right, select the Tag property
3. Add tag, click the plus and type in "Collision"
4. Select the GameObject again, and select the "Collision" tag from the Tag property dropdown
Otherwise, if that's not the issue. Make sure the projectile has a type of Collider2D component, and that the projectile, or the object being collided with, has a Rigidbody2D.
First I would like to know what the behaviour of this script curently is. Is the collision method being called, and the projectile goes through the enemy anyway? Or the collision method is not being called at all?
That being said, these are things that you should check in order for collision to work:
Make sure that the projectile and the enemy have Collider2D components attached to them.
Make sure that the projectile and/or the enemy (at least one of them must) have a Rigidbody2D attached to it.
Make sure that the layer of the projectiles and the layer of the enemies are set to collide in the collision matrix (You can find the collision matrix in Edit->ProjectSettings->Physics)
Make sure that the enemy GameObject has its tag set to "Collision".
P.S: Welcome to Unity where issues like this are, in fact, usually caused by something super simple that you probably missed.
I'm making a endless shooter game, where the bullet is just a object that goes forward until it hits something.
The enemies all have a script with an HP.
I want to know if it's to expensive to do:
void OnCollisionEnter2D(Collision2D collision) {
if(TagsAndHashes.IsTagEnemy(collision.transform.tag))
DamageHandler.CauseDamage(collision.gameObject.GetComponent<EnemyBehavior>());
}else{
pool.ReturnObject(gameObject);
}
This way I would be calling GetComponent<EnemyBehavior>() every time a player shoots an enemy.
Is it too costly or is it fine?
The game is for mobile.
Thanks.
It would be more logical and less costly to flip who is responsible for damage here.
Have a script on the enemy that detects collisions.
Have that method check the tag of the object which is colliding with it.
Then use the script already on the enemy gameobject to issue damage to itself.
This way the script does not have to go and get a reference for the other object which is of course expensive. Instead it just talks to itself... like I do.
Hope it helps.