How does a gameobject follow character controller?

There are 2 gameobjects. One is Character Controller and another is a gameobject.

I would like to know how does the gameobject follow character?

The code below is from 2Dplatformer.

var opponentPoint : Transform;
var Character : GameObject;
var Opponent : GameObject;
var InDistance : float; 
var targetTransform : Transform;		
var faceForward : boolean = false;		
private var thisTransform : Transform;

class OpponentControllerMovement 
{ 
	var walkSpeed = 3.0;
	var runSpeed = 10.0;
	var inAirControlAcceleration = 1.0;
	var gravity = 60.0;
	var maxFallSpeed = 20.0;
	var speedSmoothing = 5.0;
	var rotationSmoothing = 10.0;
	@System.NonSerialized
	var direction = Vector3.zero;
	@System.NonSerialized
	var verticalSpeed = 0.0;
	@System.NonSerialized
	var speed = 0.0;
	@System.NonSerialized
	var isMoving = false;
	@System.NonSerialized
	var collisionFlags : CollisionFlags; 
	@System.NonSerialized
	var velocity : Vector3;
	@System.NonSerialized
	var inAirVelocity = Vector3.zero;
	@System.NonSerialized
	var hangTime = 0.0;
}

var movement : OpponentControllerMovement;

class OpponentControllerJumping 
{
	var enabled = true;
	var height = 5.0; 
	var extraHeight = 4.1;
	@System.NonSerialized
	var repeatTime = 0.05;
	@System.NonSerialized
	var timeout = 0.15;
	@System.NonSerialized
	var jumping = false;
	@System.NonSerialized
	var reachedApex = false;
	@System.NonSerialized
	var lastButtonTime = -10.0;
	@System.NonSerialized
	var lastTime = -1.0;
	@System.NonSerialized
	var lastStartHeight = 0.0;
}

var jump : OpponentControllerJumping;

private var activePlatform : Transform;
private var activeLocalPlatformPoint : Vector3;
private var activeGlobalPlatformPoint : Vector3;
private var lastPlatformVelocity : Vector3;
private var areEmittersOn = false;

function Awake () 
{
	movement.direction = transform.TransformDirection (Vector3.forward);
	thisTransform = transform;
	Spawn ();
}

function Spawn () 
{
	movement.verticalSpeed = 0.0;
	movement.speed = 0.0;
	transform.position = opponentPoint.position;
}

function UpdateSmoothedMovementDirection () 
{
	InDistance = Vector3.Distance(Character.transform.position, Opponent.transform.position);
	var h = Opponent.transform.position.x; 	
		
	if (InDistance > 6)
		movement.direction = Vector3 (-h, 0, 0);

	if (Opponent.transform.position.y > 0) 
	{
		var curSmooth = movement.speedSmoothing * Time.deltaTime;
		var targetSpeed = Mathf.Min (Mathf.Abs(h), 1.0);
		movement.speed = Mathf.Lerp (movement.speed, targetSpeed, curSmooth);		
		movement.hangTime = 0.0;
	}
	else 
	{
		movement.hangTime += Time.deltaTime;
		if (InDistance > 6)
			movement.inAirVelocity += Vector3 (Mathf.Sign(h), 0, 0) * Time.deltaTime * movement.inAirControlAcceleration;
	}
}

function FixedUpdate () 
{
	transform.position.z = 0;
}

function UpdateEffects () {
	wereEmittersOn = areEmittersOn;
	areEmittersOn = jump.jumping  movement.verticalSpeed > 0.0;
	
	if (wereEmittersOn != areEmittersOn) {
		for (var emitter : ParticleEmitter in GetComponentsInChildren (ParticleEmitter)) {
			emitter.emit = areEmittersOn;
		}
	}
}

function Update () 
{		
	thisTransform.position = targetTransform.position;
	if ( faceForward )
    {
    	 thisTransform.forward = targetTransform.forward;
    }
    
	InDistance = Vector3.Distance(Character.transform.position, Opponent.transform.position);
	var h = Opponent.transform.position.x; 		
	
	if (InDistance > 6)
		movement.direction = Vector3 (-h, 0, 0);

	UpdateSmoothedMovementDirection();
	
	if (activePlatform != null) 
	{
		var newGlobalPlatformPoint = activePlatform.TransformPoint(activeLocalPlatformPoint);
		var moveDistance = (newGlobalPlatformPoint - activeGlobalPlatformPoint);
		transform.position = transform.position + moveDistance;
		lastPlatformVelocity = (newGlobalPlatformPoint - activeGlobalPlatformPoint) / Time.deltaTime;
	} 
	else 
	{
		lastPlatformVelocity = Vector3.zero;	
	}
	
	activePlatform = null;
	lastPosition = transform.position;

	var currentMovementOffset = movement.direction * movement.speed + Vector3 (0, movement.verticalSpeed, 0) + movement.inAirVelocity;

	currentMovementOffset *= Time.deltaTime;

	//movement.collisionFlags = character.Move (currentMovementOffset);

	movement.velocity = (transform.position - lastPosition) / Time.deltaTime;

	if (activePlatform != null) {
		activeGlobalPlatformPoint = transform.position;
		activeLocalPlatformPoint = activePlatform.InverseTransformPoint (transform.position);
	}
	
	if (movement.direction.sqrMagnitude > 0.01)
		transform.rotation = Quaternion.Slerp (transform.rotation, Quaternion.LookRotation (movement.direction), Time.deltaTime * movement.rotationSmoothing);
	
	if (Opponent.transform.position.y > 0) {
		movement.inAirVelocity = Vector3.zero;
		if (jump.jumping) {
			jump.jumping = false;
			SendMessage ("DidLand", SendMessageOptions.DontRequireReceiver);

			var jumpMoveDirection = movement.direction * movement.speed + movement.inAirVelocity;
			if (jumpMoveDirection.sqrMagnitude > 0.01)
				movement.direction = jumpMoveDirection.normalized;
		}
	}	

	UpdateEffects ();	
}

function OnControllerColliderHit (hit : ControllerColliderHit)
{
	if (hit.moveDirection.y > 0.01) 
		return;

	if (hit.moveDirection.y < -0.9  hit.normal.y > 0.9) {
		activePlatform = hit.collider.transform;	
	}
}

function GetSpeed () {
	return movement.speed;
}

function GetVelocity () {
	return movement.velocity;
}

function IsMoving () {
	return movement.isMoving;
}

function IsJumping () {
	return jump.jumping;
}

function IsTouchingCeiling () {
	return (movement.collisionFlags  CollisionFlags.CollidedAbove) != 0;
}

function GetDirection () {
	return movement.direction;
}

function GetHangTime() {
	return movement.hangTime;
}

function Reset () {
	gameObject.tag = "Opponent";
}

function SetControllable (controllable : boolean) {
	canControl = controllable;
}

function OnEndGame()
{	
	this.enabled = false;
}

When I run this code, the gameobject moves to character at once (less than 1 second)

I want the distance between them greater than 6, then it moves to character at certain speed.

How should I code it?

Generally, to make an object follow another, you would use code something like this:-

var targetObj: Transform;

function Update() {
	var heading = targetObj.position - transform.position;
	var distance = heading.magnitude;
	
	if (distance > 6) {
		transform.LookAt(targetObj);
		var direction = heading / distance;
		transform.Translate(direction * speed * Time.deltaTime);
	}
}

Here is the code:

function Awake () 
{
	movement.direction = transform.TransformDirection (Vector3.forward);
	thisTransform = transform;
	Spawn ();
}

function Spawn () 
{
	movement.verticalSpeed = 0.0;
	movement.speed = 1.0;
}

function Update () 
{	    
       var heading = targetTransform.position - transform.position; 
       var twodistance = heading.magnitude; 	
	
	if (twodistance >= 6)
	{	    
	    transform.LookAt(targetTransform); 
            var twodirection = heading / twodistance; 
            transform.Translate(twodirection * movement.speed * Time.deltaTime); 
	}
}

function FixedUpdate () 
{
	transform.position.z = 0;
}

When I run the script, the gameobject did not move towards or follow character, where twodistance is 12.5.

I want the opponent gameobject walk towards the character. Here is the code:

function Update () 
{	    
    var heading = targetTransform.position - transform.position; 
    var twodistance = heading.magnitude; 	
	
	if (twodistance >= InBetweenDistance)
	{ 
             MovementTowardsTarget();
	}
}

function MovementTowardsTarget() 
{
	var movementOP = transform.TransformDirection( Vector3( targetTransform.position.x, 0, 0 )); 
	movementOP.y = 0;
	movementOP.Normalize(); 
	
	var absTRPos = Vector2( Mathf.Abs( targetTransform.position.x ), Mathf.Abs( targetTransform.position.y ) );
	movementOP *= movement.walkSpeed * ( ( absTRPos.x > absTRPos.y ) ? absTRPos.x : absTRPos.y );
	
	var h = movementOP.x;	
	movement.isMoving = Mathf.Abs(h) > 0.1; 
		
	Debug.Log("h: " + h + "; targetTransform: " + targetTransform.position.x + "; movementOP: " + movementOP + "; absTRPos: " + absTRPos + "; movement.isMoving: " + movement.isMoving);
		
	if (movement.isMoving)
		movement.direction = Vector3 (h, 0, 0);
	
	if (movement.isMoving) 
	{		
		var curSmooth = movement.speedSmoothing * Time.deltaTime;
		var targetSpeed = Mathf.Min (Mathf.Abs(h), 1.0);
			
		targetSpeed *= movement.walkSpeed;
		movement.speed = Mathf.Lerp (movement.speed, targetSpeed, curSmooth);
		movement.hangTime = 0.0;
	}
	else 
	{
		movement.hangTime += Time.deltaTime;
		if (movement.isMoving)
		{
			movement.inAirVelocity += Vector3 (Mathf.Sign(h), 0, 0) * Time.deltaTime * movement.inAirControlAcceleration;
		}
	}
}

Here is the debug log:
h: -1.432786E-06; targetTransform: 4.006361; movementOP: (0.0, 0.0, 12.0); absTRPos: (4.0, 1.1); movement.isMoving: False

When i run it, the opponent did not walk.

How should I fix it?

There doesn’t seem to be any code in that excerpt that would move the opponent. Are you handling the movement in FixedUpdate? If so, please post that as well.

I updated the code, the opponent can walk towards character a little and the walk speed is fast.

The debug log shows:
head: (-10.3, 2.0, 0.0); 2dist: 10.4903; 2direct: (-1.0, 0.2, 0.0); transform: (0.0, 0.0, 0.2)

How should I change the code to make the opponent walk towards character at certain speed?

var opponentPoint : Transform;
var Character : GameObject;
var Opponent : GameObject;
var InDistance : float; 
var InBetweenDistance : float = 10.0;
var movementSpeed : float = 1.0;
var targetTransform : Transform;		
var faceForward : boolean = false;		
private var thisTransform : Transform;

class OpponentControllerMovement {
	var walkSpeed = 3;
	var runSpeed = 10.0;
	var inAirControlAcceleration = 1.0;
	var gravity = 60.0;
	var maxFallSpeed = 20.0;
	var speedSmoothing = 5.0;
	var rotationSmoothing = 10.0;
	@System.NonSerialized
	var direction = Vector3.zero;
	@System.NonSerialized
	var verticalSpeed = 0.0;
	@System.NonSerialized
	var speed = 0.0;
	@System.NonSerialized
	var isMoving = false;
	@System.NonSerialized
	var collisionFlags : CollisionFlags; 
	@System.NonSerialized
	var velocity : Vector3;
	@System.NonSerialized
	var inAirVelocity = Vector3.zero;
	@System.NonSerialized
	var hangTime = 0.0;
}

var movement : OpponentControllerMovement;

function Awake () 
{
	movement.direction = transform.TransformDirection (Vector3.forward);
}

function FixedUpdate () 
{
	transform.position.z = 0;
}

function Update () 
{	    
    var heading = targetTransform.position - transform.position; 
    var twodistance = heading.magnitude; 		
	
	if (twodistance >= InBetweenDistance)
	{
        var twodirection = heading / twodistance; 
        MovementTowardsTarget();
        transform.Translate(movement.direction * movement.walkSpeed * Time.deltaTime); 
        Debug.Log("head: " + heading + "; 2dist: " + twodistance + "; 2direct: " + twodirection + "; transform: " + movement.direction * movement.walkSpeed * Time.deltaTime);
	}
}

function MovementTowardsTarget() 
{
	movement.direction = transform.TransformDirection( Vector3( targetTransform.position.x, 0, 0 )); 
	movement.direction.y = 0;
	movement.direction.Normalize(); 
	movement.direction *= movement.walkSpeed ;
		
	var h = movement.direction.x;	
	movement.isMoving = Mathf.Abs(h) > 0.1; 
		
	if (movement.isMoving)
		movement.direction = Vector3 (h, 0, 0);
	
	if (movement.isMoving) 
	{		
		var curSmooth = movement.speedSmoothing * Time.deltaTime;
		var targetSpeed = Mathf.Min (Mathf.Abs(h), 1.0);
			
		targetSpeed *= movement.walkSpeed;
		movement.speed = Mathf.Lerp (movement.speed, targetSpeed, curSmooth);
		movement.hangTime = 0.0;
	}
	else 
	{
		movement.hangTime += Time.deltaTime;
		if (movement.isMoving)
		{
			movement.inAirVelocity += Vector3 (Mathf.Sign(h), 0, 0) * Time.deltaTime * movement.inAirControlAcceleration;
		}
	}
}

Your code already seems to be based on a fixed movement speed and takes framerate into account with Time.deltaTime. Do you mean you want to make the opponent speed up when the player is far away?

Here are the screenshots for

Before run the program

2 objects’s distance (left hand side is character, right hand side is opponent)

C ----------------- O

and

After run the program

C ------------ O

What do I want is that

Opponent walks towards character at a slower speed

The result expected is

C - O

I did not know why the Opponent did not move towards character until hit it.

372839--12905--$after_115.png
372839--12906--$before_207.png

I changed the code

from

transform.Translate(movement.direction * movement.walkSpeed * Time.deltaTime);

to

transform.Translate(movement.direction * movement.walkSpeed * Time.deltaTime, targetTransform.transform);

The opponent moves backward infinitely, but not move towards character on the left hand side.

Also, I want the opponent follows character if character walks to the right hand side of the opponent, then opponent will walk towards right hand side too.