实现功能是哪个物体的速度有变化,表示要操作哪个物体,手柄拿起物体后靠近哪个轴,就把轴的截面两个自由度的坐标值给物体,且固定物体在轴的方向上。为了避免手柄一直在轴的方向上操作不方便,将限制自由度的高度设为轴的高度。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Attach : MonoBehaviour
{
private const int partnum = 5;
private const int stickernum = 3;
//1 物体的赋值直接在面板上拖动赋值
public GameObject downbase;
public GameObject[] part = new GameObject[partnum];
public GameObject[] sticker = new GameObject[stickernum];
// Use this for initialization
void Start()
{
}
// Update is called once per frame
void Update()
{
//2 通过速度来判断要操作的是哪个物体
foreach (var itemPart in part)
{
if (itemPart.GetComponent<Rigidbody>().velocity.magnitude > 0)
{
Attraction(itemPart);
}
}
}
//3 实现吸附
private void Attraction(GameObject part)
{
//3.1 当要操作的物体与底板的高度满足阈值时限制移动对象的自由度
float height = part.transform.localPosition.y - downbase.transform.localPosition.y;
if (height < 0.2f)
{
//3.2 判断物体要靠近的是哪个轴,对应的限制其自由度
foreach (var itemSticker in sticker)
{
float disx = part.transform.localPosition.x - itemSticker.transform.localPosition.x;
float disz = part.transform.localPosition.z - itemSticker.transform.localPosition.z;
//3.3 物体与轴截面两个坐标轴方向上与轴的距离满足一定的条件则将轴的坐标给物体
if (Mathf.Abs(disx) < 0.025 && Mathf.Abs(disz) < 0.025)
{
part.transform.localPosition = new Vector3(itemSticker.transform.localPosition.x, part.transform.localPosition.y, itemSticker.transform.localPosition.z);
}
}
}
}
}