1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| using UnityEngine;
public class ForceFieldObj : MonoBehaviour { private Vector3 center; private Vector3 gravitationPos; [SerializeField, Header("力场半径")] private float forceRadius; [SerializeField, Header("斥力")] private float repulsion; [SerializeField, Header("吸引力")] private float targetAttractive; [SerializeField, Header("吸引力缩放")] private float speed = 1f; private Camera cam; [SerializeField, Header("应用缩放效果")] private bool useScale;
void Start() { gravitationPos = transform.position; cam = Camera.main; }
void Update() { if (forceRadius == 0) return; var inputMouse = Input.mousePosition; center = new Vector3(inputMouse.x, inputMouse.y, 90); center = cam.ScreenToWorldPoint(center); center = new Vector3(center.x, center.y, 90);
var velocity = Vector3.zero; var len = (transform.position - center).magnitude; if (len < forceRadius) { var rate = (forceRadius - len) / forceRadius; var intensity = repulsion * rate; velocity += (transform.position - center) * intensity * Time.deltaTime; }
velocity += (gravitationPos - transform.position) * Time.deltaTime * targetAttractive * speed;
transform.position += velocity;
transform.localScale = useScale ? Mathf.Clamp01((this.transform.position - center).magnitude / forceRadius) * Vector3.one : transform.localScale; } }
|