1. 程式人生 > 其它 >Unity 實現簡單力場效果

Unity 實現簡單力場效果

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; } }