Javascript “如何拥有游戏对象”;snap";到位了吗?

Javascript “如何拥有游戏对象”;snap";到位了吗?,javascript,c#,unity3d,Javascript,C#,Unity3d,我用多个零件制作了一台机器的模型。我希望在拖动鼠标左键时,能够将部件“捕捉”到位。就像下面的视频: 以下是我的代码: JS 在过去,我用两种方式实现了这种功能。第一种方法是存储对象的原始变换,并提供当矢量3.distance在足够近的范围内时捕捉到原始位置(状态)的选项。第二种方法是利用映射的捕捉边(基本上是空的游戏对象),每个捕捉边都映射到相邻对象的捕捉边上。在角落处使用标记对象(即“空对象”,只是一个统一的普通游戏对象)。这是我在这个网站上看到的为数不多的智能评论之一,nice one E

我用多个零件制作了一台机器的模型。我希望在拖动鼠标左键时,能够将部件“捕捉”到位。就像下面的视频:

以下是我的代码:

JS


在过去,我用两种方式实现了这种功能。第一种方法是存储对象的原始变换,并提供当矢量3.distance在足够近的范围内时捕捉到原始位置(状态)的选项。第二种方法是利用映射的捕捉边(基本上是空的游戏对象),每个捕捉边都映射到相邻对象的捕捉边上。在角落处使用标记对象(即“空对象”,只是一个统一的普通游戏对象)。这是我在这个网站上看到的为数不多的智能评论之一,nice one EJSD。过去我用两种方式实现了这种功能。第一种方法是存储对象的原始变换,并提供当矢量3.distance在足够近的范围内时捕捉到原始位置(状态)的选项。第二种方法是利用映射的捕捉边(基本上是空的游戏对象),每个捕捉边都映射到相邻对象的捕捉边上。在角落处使用标记对象(即“空对象”,只是一个统一的普通游戏对象)。这是我在这个网站上看到的为数不多的几个有智慧的评论之一。
 #pragma strict

 var partnerName = "Hub";
 var closeVPDist = 0.05;
 var moveSpeed = 40.0;
 var rotateSpeed = 90.0;

 var closeColor = Color(1,0,0);

 private var dist = Mathf.Infinity;
 private var normalColor : Color;
 private var partnerGO : GameObject;

 function Start() {
     normalColor = renderer.material.color;
     partnerGO = GameObject.Find(partnerName);
 }

 function OnMouseDrag() {
     var partnerPos = Camera.main.WorldToViewportPoint(partnerGO.transform.position);
     var myPos = Camera.main.WorldToViewportPoint(transform.position);
     dist = Vector2.Distance(partnerPos, myPos);
     renderer.material.color = (dist < closeVPDist) ? closeColor : normalColor;
 }

 function OnMouseUp() {
     if (dist < closeVPDist) {
         transform.parent = partnerGO.transform;
         InstallPart();
     }
 }

 function InstallPart() {
     while (transform.localPosition != Vector3.zero || transform.localRotation != Quaternion.identity) {
         transform.localPosition = Vector3.MoveTowards(transform.localPosition, Vector3.zero, Time.deltaTime * moveSpeed);
         transform.localRotation = Quaternion.RotateTowards(transform.localRotation, Quaternion.identity, Time.deltaTime * rotateSpeed);
         yield;
     }
 }
private Vector3 screenPoint;
    private Vector3 offset;

    void OnMouseDown(){
        screenPoint = Camera.main.WorldToScreenPoint(gameObject.transform.position);
        offset = gameObject.transform.position - Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z));
    }

    void OnMouseDrag(){
        Vector3 cursorPoint = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPoint.z);
        Vector3 cursorPosition = Camera.main.ScreenToWorldPoint(cursorPoint) + offset;
        transform.position = cursorPosition;
    }