前言
项目中要用到一个力场的效果,偶然在bilibili中找到了。记录一下。
原视频: https://www.bilibili.com/video/BV18E411M785
效果
源码
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;
}
}