crossSection 盒子裁切闪烁问题

crossSection 盒子裁切闪烁问题

问题定位为鼠标坐标xyz导致出现的,和别人写的那个layer不一样

CappedSectionBox.cs

//The purpose of this script is to manipulate the scale and position of the capped section box gizmo object 
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace WorldSpaceTransitions
{
    public class CappedSectionBox : MonoBehaviour, ISizedSection
    {

        //public LayerMask layer = 13;
        //[Space(10)]
        public Collider xAxis;
        public Collider xAxisNeg;
        [Space(10)]
        public Collider yAxis;
        public Collider yAxisNeg;
        [Space(10)]
        public Collider zAxis;
        public Collider zAxisNeg;

        private enum GizmoAxis { X, Y, Z, Xneg, Yneg, Zneg, XYRotate, XZRotate, YZRotate, none };
        private GizmoAxis selectedAxis;

        private RaycastHit hit;
        private Ray ray, ray1;
        private Plane dragplane;
        private float rayDistance, newRotY, rayDistancePrev, distance;
        private Vector3 lookCamera, startDrag, startPos, startDragRot, lookHitPoint, startScale;
        private bool dragging;
        private Vector3 Offset;

        // Use this for initialization
        void Start()
        {

        }

        // Update is called once per frame
        void Update()
        {

            if (Input.GetMouseButtonDown(0))
            {

                ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                dragplane = new Plane();

                RaycastHit hit;
                if (xAxis.Raycast(ray, out hit, 1000f))
                {
                    selectedAxis = GizmoAxis.X;
                    dragplane.SetNormalAndPosition(transform.up, transform.position);
                }
                else if (xAxisNeg.Raycast(ray, out hit, 1000f))
                {
                    selectedAxis = GizmoAxis.Xneg;
                    dragplane.SetNormalAndPosition(-transform.up, transform.position);
                }
                else if (yAxis.Raycast(ray, out hit, 1000f))
                {
                    selectedAxis = GizmoAxis.Y;
                    dragplane.SetNormalAndPosition(transform.forward, transform.position);
                }
                else if (yAxisNeg.Raycast(ray, out hit, 1000f))
                {
                    selectedAxis = GizmoAxis.Yneg;
                    dragplane.SetNormalAndPosition(-transform.forward, transform.position);
                }
                else if (zAxis.Raycast(ray, out hit, 1000f))
                {
                    selectedAxis = GizmoAxis.Z;
                    dragplane.SetNormalAndPosition(transform.up, transform.position);
                }
                else if (zAxisNeg.Raycast(ray, out hit, 1000f))
                {
                    selectedAxis = GizmoAxis.Zneg;
                    dragplane.SetNormalAndPosition(-transform.up, transform.position);
                }
                else
                {
                    //Debug.Log(hit.collider.name);
                    return;
                }
                distance = hit.distance;
                startDrag = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance));
                startPos = transform.position;
                startScale = transform.localScale;
                dragging = true;
            }

            if (dragging)
            {
                ray = Camera.main.ScreenPointToRay(Input.mousePosition);

                Vector3 onDrag = Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, distance));

                Vector3 projectedTranslation = Vector3.zero;

                if (dragging)
                {
                    float lsx = startScale.x;
                    float lsy = startScale.y;
                    float lsz = startScale.z;

                    switch (selectedAxis)
                    {
                        case GizmoAxis.X:
                            {
                                Offset = new Vector3(onDrag.x, startDrag.y, startDrag.z);
                                Vector3 translation = Offset - startDrag;
                                projectedTranslation = Vector3.Project(translation, transform.right);
                                transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
                                lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.right));
                                break;
                            }
                        case GizmoAxis.Xneg:
                            {
                                Offset = new Vector3(onDrag.x, startDrag.y, startDrag.z);
                                Vector3 translation = Offset - startDrag;
                                projectedTranslation = Vector3.Project(translation, -transform.right);
                                transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
                                lsx += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.right));
                                break;
                            }
                        case GizmoAxis.Y:
                            {
                                Offset = new Vector3(startDrag.x, startDrag.y, onDrag.z);
                                Vector3 translation = Offset - startDrag;
                                projectedTranslation = Vector3.Project(translation, transform.up);
                                transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
                                lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.up));
                                break;
                            }
                        case GizmoAxis.Yneg:
                            {
                                Offset = new Vector3(startDrag.x, startDrag.y, onDrag.z);
                                Vector3 translation = Offset - startDrag;
                                projectedTranslation = Vector3.Project(translation, -transform.up);
                                transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
                                lsy += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.up));
                                break;
                            }
                        case GizmoAxis.Z:
                            {
                                Offset = new Vector3(startDrag.x, onDrag.y, startDrag.z);
                                Vector3 translation = Offset - startDrag;
                                projectedTranslation = Vector3.Project(translation, transform.forward);
                                transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
                                lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, transform.forward));
                                break;
                            }
                        case GizmoAxis.Zneg:
                            {
                                Offset = new Vector3(startDrag.x, onDrag.y, startDrag.z);
                                Vector3 translation = Offset - startDrag;
                                projectedTranslation = Vector3.Project(translation, -transform.forward);
                                transform.position = startPos + 0.5f * (projectedTranslation.normalized * translation.magnitude);
                                lsz += translation.magnitude * Mathf.Sign(Vector3.Dot(projectedTranslation, -transform.forward));
                                break;
                            }

                    }

                    transform.localScale = new Vector3(Mathf.Clamp(lsx, 0.01f, Mathf.Infinity), Mathf.Clamp(lsy, 0.01f, Mathf.Infinity), Mathf.Clamp(lsz, 0.01f, Mathf.Infinity));

                    //foreach (UVScaler uvs in gameObject.GetComponentsInChildren<UVScaler>()) uvs.SetUV();
                }

                if (Input.GetMouseButtonUp(0))
                {
                    dragging = false;
                }
            }
        }

        void OnDisable()
        {
            dragging = false;
        }

        public void HideCage(bool val)
        {
            foreach (PlaneHover ph in gameObject.GetComponentsInChildren<PlaneHover>()) ph.GetComponent<Renderer>().enabled = val;
        }
        public void HideCaps(bool val)
        {
            foreach (Transform quad in gameObject.transform) if (quad.name.Contains("hatch")) quad.GetComponent<Renderer>().enabled = val;
        }

        public void Size(Bounds b, GameObject g, BoundsOrientation orientation)
        {
            //Debug.Log(b.ToString());
            float scale = 1f;

            Vector3 clearance = 0.01f * Vector3.one;

            transform.localScale = Vector3.one;

            transform.localScale = scale * b.size + clearance;

            transform.position = b.center;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值