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.


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.