- Home /
problem with my script need help
hi iam doing a 2d platform game, in which my enemy has to move left and if he hits any object he has to move in opposite direction. i have a written a script but it is not working, need help.
using UnityEngine; using System.Collections;
public class enemy_movement : MonoBehaviour {
public float xValue = .1f;
public float amtToMove;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
transform.position = new Vector3(transform.position.x + xValue, transform.position.y,
transform.position.z);
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "block")
{
transform.position = new Vector3(transform.position.x - xValue, transform.position.y,
transform.position.z);
}
}
}
Answer by trs9556 · Aug 05, 2013 at 01:36 AM
It's not working because the Update() function is called every frame but OnCollosionEnter is called only when something enters the collision.
In other words every frame your character is trying to move left, and then when he hits the block he moves right once, then goes back to moving left.
Based on that fact that this would infinitely loop your script is probably causing your guy to just "shake".
Instead of trying to move the character on a collision, you should should declare a variable and set it in the onCollision so the update function knows which way to move the character.
using UnityEngine;
using System.Collections;
public class enemy_movement : MonoBehaviour {
public float xValue = .1f;
public float amtToMove;
private bool movingLeft = true; //if we are moving left or right.
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
//if we are moving left, move the character to the left
if(movingLeft){
transform.position = new Vector3(transform.position.x + xValue, transform.position.y, transform.position.z);
}
//else we must be going right!
else{
transform.position = new Vector3(transform.position.x - xValue, transform.position.y, transform.position.z);
}
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "block")
{
movingLeft = !movingLeft //this will change the variable "movingLeft" to the opposite of whatever it currently is.
}
}
Answer by nadh · Aug 07, 2013 at 06:28 AM
I think if u do Movement base on the character direction, It will be more simple ..
public float xValue = .1f;
public float amtToMove;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update ()
{
transform.position = new Vector3(transform.position.x + (transform.right * xValue), transform.position.y,
transform.position.z);
}
void OnCollisionEnter(Collision other)
{
if(other.gameObject.name == "block")
{
transform.right= -transform.right;
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613111539im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
How to remove z axis control from script 1 Answer
The name 'Joystick' does not denote a valid type ('not found') 2 Answers
Coordinating multiple AI enemies 3 Answers
How to make basic AI in a 2d game? 4 Answers
Unity 3D Audio Clip Disabled 1 Answer