You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
65 lines
2.3 KiB
C#
65 lines
2.3 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
public class Seeker : MonoBehaviour {
|
|
public LayerMask collisionMask;
|
|
public float range = 3.0f;
|
|
public float maxSpeed = 3.0f; // units per second
|
|
public float acceleration = 3.0f; // increase in velocity per second
|
|
public float drag = 1.0f;
|
|
|
|
private Vector3 pivot;
|
|
private Vector3 leftMax;
|
|
private Vector3 rightMax;
|
|
private Vector3 velocity;
|
|
|
|
void Start() {
|
|
velocity = Vector3.zero;
|
|
}
|
|
|
|
// Start is called before the first frame update
|
|
void Awake() {
|
|
pivot = transform.position;
|
|
leftMax = pivot + Vector3.left * range;
|
|
rightMax = pivot + Vector3.right * range;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update() {
|
|
detectPlayer();
|
|
velocity.x = Mathf.Clamp(velocity.x, -maxSpeed, maxSpeed);
|
|
transform.position = transform.position + velocity * Time.deltaTime;
|
|
}
|
|
|
|
private void detectPlayer() {
|
|
if (detectPlayer(transform.position + Vector3.left * 1.22f, Vector3.left)) {
|
|
velocity += Vector3.left * acceleration * Time.deltaTime;
|
|
}
|
|
if (detectPlayer(transform.position + Vector3.right * 1.22f, Vector3.right)) {
|
|
velocity += Vector3.right * acceleration * Time.deltaTime;
|
|
}
|
|
}
|
|
|
|
private bool detectPlayer(Vector3 start, Vector3 dir) {
|
|
Debug.LogFormat("start: {0} dir: {1}", start, dir);
|
|
RaycastHit2D hit = Physics2D.Raycast(start, dir, range, collisionMask);
|
|
if (hit) {
|
|
if (hit.collider.gameObject.layer == LayerMask.NameToLayer("Player")) {
|
|
Debug.DrawRay(start, dir * hit.distance, Color.red);
|
|
return true;
|
|
} else {
|
|
Debug.DrawRay(start, dir * hit.distance, Color.green);
|
|
if (dir.x >= 0) {
|
|
velocity.x = Mathf.Clamp(velocity.x, -Mathf.Infinity, hit.distance / Time.deltaTime);
|
|
} else {
|
|
velocity.x = Mathf.Clamp(velocity.x, -hit.distance / Time.deltaTime, Mathf.Infinity);
|
|
}
|
|
}
|
|
} else {
|
|
Debug.DrawRay(start, dir * range, Color.gray);
|
|
}
|
|
return false;
|
|
}
|
|
}
|