Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public var MoveSpeed : float = .1;
- public var AttackRange : float = 330;
- public var MinDistance : float = 40;
- protected var players : GameObject[];
- protected var target : GameObject;
- private var elapsedTime : float = 0;
- private var pos : Vector3;
- private var distance : float;
- private var transformRef : Transform;
- private var targetTransformRef : Transform;
- function Start() {
- /* Cache transform */
- transformRef = transform;
- /* Cache position */
- pos = transformRef.position;
- /* Get all players in the game */
- players = GameObject.FindGameObjectsWithTag("player");
- if(players.length > 0) {
- if(players[0]) {
- target = players[0];
- distance = GetDistance(target);
- targetTransformRef = target.transform;
- }
- }
- }
- function FixedUpdate () {
- /* Do I already have a target? */
- if(target == null) {
- FindTarget();
- }
- if(target != null ) {
- /* Target's current position */
- var targetPos : Vector3 = targetTransformRef.position;
- var lookRotation : Quaternion = Quaternion.LookRotation(
- Vector3(targetPos.x, 0, targetPos.z) - Vector3(pos.x, 0, pos.z)
- );
- /* Look at the target */
- transformRef.rotation = Quaternion.Slerp(transformRef.rotation, lookRotation, Time.deltaTime * 10);
- transform.position.y = 1.5;
- /* How many degrees from facing the target am I? */
- var angle : float = Quaternion.Angle(transformRef.rotation, lookRotation);
- var direction : Vector3 = (targetPos - pos);
- var dirSqrMag : float = direction.sqrMagnitude;
- var moveSpeedTmp : float = MoveSpeed;
- /* Keep $x units away from target, back up if too close */
- if(dirSqrMag <= 16)
- moveSpeedTmp = MoveSpeed * (1 - Mathf.Clamp01(dirSqrMag / 16));
- else
- moveSpeedTmp = MoveSpeed * Mathf.Clamp01((dirSqrMag - 25) / (49-25));
- var movementAmount : Vector3 = direction.normalized * Time.deltaTime * moveSpeedTmp ;
- /* Reverse direction if too close */
- if(movementAmount.sqrMagnitude >= dirSqrMag) {
- movementAmount = direction;
- } else if(dirSqrMag < 16) {
- movementAmount *= -1;
- }
- pos += movementAmount;
- /* Cache the new position */
- pos.y = 1.5;
- rigidbody.MovePosition(pos);
- //transform.position.y = 1.5;
- }
- }
- function CanSeeTarget(target) : boolean {
- var hit : RaycastHit;
- if(target && Physics.Linecast(transform.position, target.transform.position, hit)) {
- return hit.transform == target.transform;
- }
- return false;
- }
- function GetDistance(target) {
- var distance = (target.transform.position - pos).sqrMagnitude;
- return distance;
- }
- function TargetInRange(distance) {
- return distance < AttackRange ? true : false;
- }
- function FindTarget() {
- yield WaitForSeconds(1);
- /* Iterate over available players, get first target found */
- for(var player : GameObject in players) {
- if(player) {
- /* Cache distance calculation */
- var d = GetDistance(player);
- /* Make sure target is in range and visible */
- if(TargetInRange(d) && CanSeeTarget(player)) {
- /* Set target variables */
- distance = d;
- target = player;
- targetTransformRef = target.transform;
- } else {
- /* No target found */
- distance = 0;
- target = null;
- targetTransformRef = null;
- }
- }
- }
- }
- function OnCollisionEnter(collision : Collision) {
- if(collision.gameObject.layer == 12) {
- print("WALL");
- } else {
- print(collision.gameObject.layer);
- }
- if(collision.gameObject.tag == gameObject.tag) {
- Physics.IgnoreCollision(collision.collider, gameObject.collider);
- }
- }
Add Comment
Please, Sign In to add comment