- Home /
Issues with Character Controller moving Enemies
Hi Guys,
So i'm new to coding, and have been working on making a 2D Platformer.
I have a bunch of enemies that deal damage, and move using the following code I learnt from a great Youtube Channel:
using UnityEngine;
using System.Collections;
public class EnemyMovementController : MonoBehaviour {
public float enemySpeed;
Animator enemyAnimator;
private Transform myTransform;
public Transform target;
// facing
public GameObject enemyGraphic;
bool canFlip = true;
bool facingRight = false;
float flipTime = 5f;
float nextFlipChance = 0f;
//attacking
public float chargeTime;
float startChargeTime;
bool charging;
Rigidbody2D enemyRB;
void Awake()
{
myTransform = transform;
}
// Use this for initialization
void Start () {
enemyAnimator = GetComponentInChildren<Animator> ();
enemyRB = GetComponent<Rigidbody2D> ();
}
// Update is called once per frame
void Update () {
if (Time.time > nextFlipChance) {
if (Random.Range (0, 10) >= 5) flipFacing ();
nextFlipChance = Time.time + flipTime;
}
}
void OnTriggerEnter2D(Collider2D other){
if (other.tag == "Player") {
if (facingRight && other.transform.position.x > transform.position.x){
flipFacing ();
} else if (!facingRight && other.transform.position.x < transform.position.x){
flipFacing ();
}
canFlip = false;
charging = true;
startChargeTime = Time.time + chargeTime;
}
}
void OnTriggerStay2D(Collider2D other){
if (other.tag == "Player") {
if (startChargeTime < Time.time){
// Get a direction vector from us to the target
Vector3 dir = target.position - myTransform.position;
// Normalize it so that it's a unit direction vector
dir.Normalize();
// Move ourselves in that direction
myTransform.position += dir * enemySpeed * Time.deltaTime;
enemyAnimator.SetBool("isCharging", charging);
}
}
}
void OnTriggerExit2D(Collider2D other){
if (other.tag == "Player") {
canFlip = true;
charging = false;
enemyAnimator.SetBool("isCharging", charging);
}
}
void flipFacing(){
if (!canFlip) return;
float facingX = enemyGraphic.transform.localScale.x;
facingX *= -1f;
enemyGraphic.transform.localScale = new Vector3 (facingX, enemyGraphic.transform.localScale.y, enemyGraphic.transform.localScale.z);
facingRight = ! facingRight;
}
}
My issue Comes when the player interacts with the enemy. As the player does not have a dynamic Rigidbody attached, mass etc do not affect it, so the player can just push the enemy around whilst taking damage should they please.
Adding a dynamic Rigidbody to the player causes a variety of glitches, like the enemies shunting or trapping the player indefinitely.
Is there any way to effectively make the enemy ignore the forces being created by the player so that it cannot be moved?
Thanks in advance for your help!
I should add that it does seem to be the enemy movement that does cause this. I've tried removing the script and leaving it as a static object, and in this state the player cannot move it, it's only when the enemy starts to move with the script that it becomes pushable.
So you don't want trapping player by enemies, but also you don't want to allow player to move enemies. I understood this correctly ?
Hi $$anonymous$$ikrim,
Yes that is correct, ideally the enemy walks up to the player, begins an attack animation cycle dealing damage from a separate script, then follows while the player remains in its trigger, or stops otherwise.
The player should not be able to then run into the enemy and push it along (for reference, the player is a small man, and the enemy is a large stone block), it should ins$$anonymous$$d prevent him from running through it, forcing the player to jump.
Hope that clears it up!
Answer by kikrim · Oct 04, 2017 at 03:57 PM
I think enemy should live space for player simply checking if is close enough. If player and enemy has dynamic colliders then:
- enemy should have very big mass
- to move player you should override rigidbody.velocity or use AddForce.
Your answer
Follow this Question
Related Questions
Rigidbody2D doesn't move 0 Answers
Weird behaviour after Collision? 0 Answers
Move an object via Rigidbody2D Physics and Transform at same time 0 Answers
Child GameObject can't use MovePosition on parent's Rigidbody2D? 3 Answers
How Do I Make a Rigidbody2d keep its force and move at a consistent speed? 2 Answers