Making a Dynamic Rigidboy NOT move on a specific condition
I'm making a game in the "Defend the Base" style, there are 5 lanes and enemies constantly spaw on them in the right side of the screen and the player has to spawn their own units to fight the enemies and avoid them from going through the left side of the screen, in other words, don't let them reach you (or something like that, and all units move strictly horizontaly)
I was doing fine until I had to program the movement, the units should walk against each other and when colliding they should stop moving to beat themselves to death. At first I was doing the movement with transform.Translate but then I had to change it, thing is I heard about this "CharacterController.Move" and "Rigidbody.MovePosition". Didn't manage to make it work with the CharacterController cause I needed collision checks but Rigidbody.MovePosition did it quite well. The thing is that for it to work I had to configure the Rigidbodies as dynamic and it is causing a problem. Here's the code for the PlayerUnit's movement:
public float speed;
private Rigidbody2D rb;
private Coroutine moveCoroutine;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
moveCoroutine = StartCoroutine("Move");
}
private IEnumerator Move()
{
while (true)
{
rb.MovePosition(transform.position + Vector3.right * speed * Time.deltaTime);
yield return null;
}
}
private void OnTriggerEnter2D (Collider2D col)
{
if (col.gameObject.name.Equals("EndWall"))
Destroy(this.gameObject);
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("EnemyUnit"))
StopCoroutine(moveCoroutine);
if (collision.gameObject.CompareTag("PlayerUnit"))
StopCoroutine(moveCoroutine);
}
(The enemies use a very similar script naturaly, and at the moment the movement is inside a Coroutine but I'll be moving it to FixedUpdate soon) After two oposing units collide they stop as they should, but when a third unit touches them it sends them both sliding away. I made a simple solution for this:
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("EnemyUnit"))
{
StopCoroutine(moveCoroutine);
rb.isKinematic = true;
}
if (collision.gameObject.CompareTag("PlayerUnit"))
{
StopCoroutine(moveCoroutine);
rb.isKinematic = true;
}
}
The thing is that every cell inside my body is telling me that I'm doing it wrong, very wrong. What is the right way of doing it?
Your answer
Follow this Question
Related Questions
How to add speed to a child kinematic rigid body? 0 Answers
Rigdbody upforce 0 Answers
How can I move a Kinematic Rigidbody2d along the x-axis? 1 Answer