首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线上站就在Vector3前

线上站就在Vector3前
EN

Stack Overflow用户
提问于 2015-05-06 03:42:02
回答 2查看 87关注 0票数 0

我试着做一个直线,但它太精确了,所以它不是我想要的工作方式。

我似乎不知道如何执行从point A转换而来的行,并阻止0.001f远离点B (Point A意为camera.transform.position,以及point B意为代码片段中的handle )。

代码语言:javascript
复制
foreach(Vector3 handle in handles){
    if(!Physics.Linecast(camera.transform.position, handle)){
        Handles.FreeMoveHandle(handle, Quaternion.identity, 0.001f, Vector3.zero, Handles.DotCap);
    }
}

那么,从相机到重点,我如何才能让Linecast停下来呢?

编辑

前视镜

在前面的视图中,并不是所有的句柄都显示:

后视镜

在后面的视图中,几乎所有的句柄都在那里:

全码

CreatureCreatorEditor.cs

代码语言:javascript
复制
using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using Creature;

[CustomEditor(typeof(Creator))]
public class CreatureCreatorEditor : Editor {
    
    HashSet<Vector3> handles = new HashSet<Vector3>();

    void OnEnable(){
        Creator t = (Creator)target;
        Mesh mesh = t.GetComponent<MeshFilter>().sharedMesh;
        if (mesh != null) {
            Vector3[] vertices = mesh.vertices;
            Vector3 lp = t.transform.position;
            foreach (Vector3 v in vertices) {
                Vector3 p = (lp - v);
                handles.Add(new Vector3 (p.x, -p.z, p.y));
            }
        }
    }

    public void OnSceneGUI(){
        Handles.color = Color.red;
        Camera camera = Camera.current;
        foreach(Vector3 handle in handles){
            Vector3 point = camera.WorldToViewportPoint(handle);
            if(point.x > 0 && point.x < 1 && point.y > 0 && point.y < 1){
//              float dist = Vector3.Distance(camera.transform.position, handle);
//              Vector3 fwd = camera.transform.TransformDirection(handle);
                Vector3 newBPos = new Vector3(handle.x - 0.001f, handle.y - 0.001f, handle.z - 0.001f);
                if(!Physics.Linecast(camera.transform.position, newBPos)){
                    Handles.FreeMoveHandle(handle, Quaternion.identity, 0.001f, Vector3.zero, Handles.DotCap);
                }
            }
        }
    }

    public override void OnInspectorGUI(){

    }
}

Creator.cs

代码语言:javascript
复制
using UnityEngine;
using UnityEditor;
using System.Collections;

namespace Creature{
    [RequireComponent(typeof(MeshFilter))]
    [RequireComponent(typeof(MeshCollider))]
    public class Creator : MonoBehaviour {

    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-06 17:53:37

我喜欢它的工作原理,我只需要让Y轴正常工作。

代码语言:javascript
复制
public void OnSceneGUI(){
    Camera camera = Camera.current;
    Handles.color = Color.red;
    Vector3 mp = Event.current.mousePosition;
    Ray ray = camera.ScreenPointToRay(mp);
    RaycastHit hit;
    if(Physics.Raycast(ray, out hit)){
        Vector3 pos = hit.point;
        foreach(Vector3 handle in handles){
            if(Vector3.Distance(handle, pos) <= 0.05f){
                Handles.FreeMoveHandle(handle, Quaternion.identity, 0.001f, Vector3.zero, Handles.DotCap);
            }
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2015-05-06 04:42:05

你需要一个补偿。你应该从B位置减去0.001f。

这将对x,y,z位置起作用。

代码语言:javascript
复制
const float newPosOffset = 0.001f;

    foreach(Vector3 handle in handles){
    Vector3 newBPos = new Vector3(handle.x-newPosOffset ,handle.y-newPosOffset ,handle.z-newPosOffset );
        if(!Physics.Linecast(camera.transform.position, newBPos)){
            Handles.FreeMoveHandle(handle, Quaternion.identity, 0.001f, Vector3.zero, Handles.DotCap);
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30067078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档