public virtual void OnDragOut() { transform.rotation = Quaternion.identity; Rigidbody rigb = rootGameObject.GetComponentInChildren <Rigidbody>(); if (rigb != null) { rigb.detectCollisions = false; } Collider[] colls = GetComponentsInChildren <Collider>(); foreach (Collider coll in colls) { coll.enabled = false; if (coll is MeshCollider) { coll.isTrigger = true; } } if (null == itemBounds) { itemBounds = GetComponent <ItemDraggingBounds>(); } if (null != itemBounds) { itemBounds.showBounds = true; } }
void InitBounds(PlantInfo plantInfo) { mInitBounds = true; ItemDraggingBounds draggingBounds = gameObject.AddComponent <ItemDraggingBounds>(); Vector3 size = plantInfo.mSize * Vector3.one; size.y = plantInfo.mHeight; draggingBounds.ResetBounds(0.5f * plantInfo.mHeight * Vector3.up, size); }
protected void CloseItemBounds() { if (null != mAdsorbItemBounds) { mAdsorbItemBounds.showBounds = false; mAdsorbItemBounds = null; } if (null != mOverlapedItemBounds) { mOverlapedItemBounds.showBounds = false; mOverlapedItemBounds = null; } }
static void ResetItemBounds() { GameObject[] selectedObjArray = Selection.gameObjects; for (int i = 0; i < selectedObjArray.Length; ++i) { ItemDraggingBounds border = selectedObjArray[i].GetComponent <ItemDraggingBounds>(); if (null == border) { border = Undo.AddComponent <ItemDraggingBounds>(selectedObjArray[i]); } border.Reset(); UnityEditor.EditorUtility.SetDirty(selectedObjArray[i]); } }
protected override void FixPosByItemBounds(Ray cameraRay) { if (null == itemBounds) { mOverlaped = false; return; } if (!mRayHitTerrain) { itemBounds.activeState = false; return; } mHitPos.x = Mathf.RoundToInt(mHitPos.x); mHitPos.y -= 0.1f; mHitPos.z = Mathf.RoundToInt(mHitPos.z); SetPos(mHitPos); CloseItemBounds(); if (null == mFindBounds) { mFindBounds = new List <ItemDraggingBounds> (); } List <ISceneObjAgent> sceneObjs = SceneMan.GetActiveSceneObjs(typeof(DragItemAgent), true); float curDis; bool rayHitBounds = false; Bounds selfBounds = itemBounds.worldBounds; selfBounds.size -= 0.01f * Vector3.one; Bounds otherBounds; for (int i = 0; i < sceneObjs.Count; ++i) { DragItemAgent dragItem = sceneObjs[i] as DragItemAgent; if (null != dragItem.gameObject) { ItemDraggingBounds checkBounds = dragItem.gameObject.GetComponentInChildren <ItemDraggingBounds>(); if (null != checkBounds) { otherBounds = checkBounds.worldBounds; mFindBounds.Add(checkBounds); if (otherBounds.IntersectRay(cameraRay, out curDis) && curDis <= mMinDis + 0.05f && Vector3.Distance(playerPos, cameraRay.origin + curDis * cameraRay.direction.normalized) < DraggingDistance) { mTooFar = false; mMinDis = curDis; mAdsorbItemBounds = checkBounds; mHitPos = cameraRay.origin + curDis * cameraRay.direction.normalized; rayHitBounds = true; } if (mRayHitTerrain && otherBounds.Intersects(selfBounds)) { mAdsorbItemBounds = checkBounds; } } } } if (null != mAdsorbItemBounds) { SetPos(mHitPos); mFindBounds.Remove(mAdsorbItemBounds); mAdsorbItemBounds.showBounds = true; mAdsorbItemBounds.activeState = true; otherBounds = mAdsorbItemBounds.worldBounds; bool hitLeft = false, hitRight = false, hitFront = false, hitBack = false, hitTop = false, hitBottom = false; if (rayHitBounds) { rootGameObject.transform.position = mHitPos; selfBounds = itemBounds.worldBounds; if (Mathf.Abs(mHitPos.x - otherBounds.min.x) < 0.01f) { hitLeft = true; } else if (Mathf.Abs(mHitPos.x - otherBounds.max.x) < 0.01f) { hitRight = true; } else if (Mathf.Abs(mHitPos.z - otherBounds.max.z) < 0.01f) { hitBack = true; } else if (Mathf.Abs(mHitPos.z - otherBounds.min.z) < 0.01f) { hitFront = true; } else if (Mathf.Abs(mHitPos.y - otherBounds.min.y) < 0.01f) { hitBottom = true; } else if (Mathf.Abs(mHitPos.y - otherBounds.max.y) < 0.01f) { hitTop = true; } } else { float maxDS = 100f; if (Mathf.Abs(selfBounds.max.x - otherBounds.min.x) < maxDS) { hitLeft = true; maxDS = Mathf.Abs(selfBounds.max.x - otherBounds.min.x); } if (Mathf.Abs(selfBounds.min.x - otherBounds.max.x) < maxDS) { hitLeft = false; hitRight = true; maxDS = Mathf.Abs(selfBounds.min.x - otherBounds.max.x); } if (Mathf.Abs(selfBounds.min.z - otherBounds.max.z) < maxDS) { hitLeft = false; hitRight = false; hitBack = true; maxDS = Mathf.Abs(selfBounds.min.z - otherBounds.max.z); } if (Mathf.Abs(selfBounds.max.z - otherBounds.min.z) < maxDS) { hitLeft = false; hitRight = false; hitBack = false; hitFront = true; } } if (hitLeft) { mHitPos += (otherBounds.min.x - selfBounds.max.x) * Vector3.right; mHitPos.x = Mathf.FloorToInt(mHitPos.x); } else if (hitRight) { mHitPos += (otherBounds.max.x - selfBounds.min.x) * Vector3.right; mHitPos.x = Mathf.CeilToInt(mHitPos.x); } else if (hitFront) { mHitPos += (otherBounds.min.z - selfBounds.max.z) * Vector3.forward; mHitPos.z = Mathf.FloorToInt(mHitPos.z); } else if (hitBack) { mHitPos += (otherBounds.max.z - selfBounds.min.z) * Vector3.forward; mHitPos.z = Mathf.CeilToInt(mHitPos.z); } else if (hitTop) { mHitPos += (otherBounds.max.y - selfBounds.min.y) * Vector3.up; } else if (hitBottom) { mHitPos += (otherBounds.min.y - selfBounds.max.y) * Vector3.up; } mHitPos.x = Mathf.RoundToInt(mHitPos.x); mHitPos.y -= 0.1f; mHitPos.z = Mathf.RoundToInt(mHitPos.z); if (Physics.Raycast(mHitPos + Vector3.up, Vector3.down, out fhitInfo, 10f, layerMask)) { mHitPos.y = fhitInfo.point.y; } SetPos(mHitPos); if (hitTop || hitBottom) { mOverlaped = true; itemBounds.activeState = false; return; } selfBounds = itemBounds.worldBounds; selfBounds.size -= 0.01f * Vector3.one; for (int i = 0; i < mFindBounds.Count; ++i) { if (null != mFindBounds[i] && selfBounds.Intersects(mFindBounds[i].worldBounds)) { mOverlaped = true; itemBounds.activeState = false; mOverlapedItemBounds = mFindBounds[i]; mOverlapedItemBounds.showBounds = true; mOverlapedItemBounds.activeState = false; mFindBounds.Clear(); return; } } } if (!checkTerrain(mHitPos)) { mOverlaped = true; itemBounds.activeState = false; return; } mFindBounds.Clear(); mOverlaped = false; itemBounds.activeState = true; }