Unity 實現簡單力場效果
阿新 • • 發佈:2022-05-19
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ItemScript4 : MonoBehaviour { /// <summary> /// 要躲避的物體 /// </summary> public Transform center; /// <summary> /// 引力位置 /// </summary> public Vector3 gravitationPos = Vector3.zero;/// <summary> /// 出生位置 /// </summary> public Vector3 createPos = Vector3.zero; /// <summary> /// 力場影響範圍,半徑 /// </summary> public float forceRadius = 4; /// <summary> /// 斥力 /// </summary> public float repulsion; /// <summary> /// 吸引力 /// </summary>public float targetAttractive; // Start is called before the first frame update void Start() { createPos= this.transform.position; gravitationPos= this.transform.position; } // Update is called once per frame void Update() { //速度 var velocity = Vector3.zero;//計算跟隨物體與力場物體的距離 var len = (this.transform.position - center.position).magnitude; //計算距離 //如果距離小於範圍,就是處於力場之中 if (len < forceRadius) { //力場半徑-距離/力場半徑 var rate = (forceRadius - len) / forceRadius; //根據距離來計算力的強度(如果沒有這一步,會出現抖動) var intensity = repulsion * rate; //速度要加上這個值 velocity += (this.transform.position - center.position) * intensity * Time.deltaTime; //計算斥力 } velocity += (gravitationPos - this.transform.position) * Time.deltaTime * targetAttractive; //同時計算目標點的引力 this.transform.position += velocity; //計算大小,跟隨物體與引力中心離的越近越小 this.transform.localScale = Mathf.Clamp01((this.transform.position - center.position).magnitude / forceRadius) * Vector3.one; } }