From 17576b4713ea37015c8253d8f7e9c199106422c3 Mon Sep 17 00:00:00 2001 From: sippeangelo Date: Thu, 26 May 2016 23:53:37 +0200 Subject: [PATCH] Miniature grabbing --- Assets/Controller Right.prefab | Bin 18836 -> 20732 bytes Assets/FurnitureMiniature.cs | 6 +--- Assets/RightController.cs | 59 ++++++++++++++++++++++++++++----- Assets/Test.unity | Bin 120032 -> 112272 bytes 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/Assets/Controller Right.prefab b/Assets/Controller Right.prefab index 58c26923f62930003d2553ed5123bb10b36a1937..4985bea1abec36a1312d4d6e952fb4256e084e69 100755 GIT binary patch delta 2234 zcmZWqeN0nV6u-BH`iiKOS1I%r`dVl$NB}bpRH;%xz(w7gV}>ct7DOoWS?hvsi#56g z&9X5MCS)H*vMkG%Y(uLKBN#Ad!DKVIY{5UAQL-807UPzEpfK6F?}EDWlJnj<=l473 z-1F{v_jLoE?xjvbaxw`~rU@ZSP%pwKS(Wo#&dS{@$m5xr85)OgA~#1%!pq@KQZBWF!DOP#A=8xmgsDfS_kYZGlX!3?dN-i3eiot- zf#uVXTUc?f2E*vAU#-DuWYH5pB^!}n$!wIxC_E4M@1P{i{J1fMV!Ld$zu;PZgn%}A zX-Yl%SuX|@BFKnpNH69Kz=~wk!9BC6_ypzA&1kcg8JV9vjhf50G|C@9n^j4Q^3UZr z&H9U5J4#xcngYA(f&{k`&T1X&)GbvS_U{eUZt{off&qWiTGG68PDgda-pXL0z8+(m zcfJ%jP)9n*esTbf65Q>G-P|5Sw?KDV1-%MCrI}Lu@O}8PAU;rLW?1d4A!f0$GFT-V z#=8hbR)J2aTD4V3RdBa=AmiDnKOXX^J~)I?$?%aHd%-HDPGGnGD0Y7`A1MWXM_xbP z#YGJg_sKd!>cAkIXean(5ej9&{Q!N@74ufk=2$R4|2JhE>xVaGNh1sJzHG*H*JV*( z)x@C(Xi1tXJ={mAAM`ef%HXvbg<~A=L_?wv@Ge4|O`uh98nw4=f_n%DlV!QCkMk!`?=Ni&Eb_2e!OSA}Rx(GMz0_|g(<61UHWt{J}sK{V0$GRXjU80lV z#=8sJ(?xwvD@S_Jk~D%5-bpvp4)_cS6L1I9D&3r*;Gjn@sOD3S^~1jyEGL0E!@Rl+ zCqKHra-I_jPJeWg%1az;FhNU(ncje-84|64;S5nfGB%fgI78C7Qs5R6y5J!aCSip` zbc|%-aNyN|=i(btJtw(2HUXO)QksJ2YjowG*KtO_1dR@}Tei%n2-Td@iCA<~CmT67 z34;y^ciZ3;;WvjsN15gv?dE7f+Wf4KPH^m08ss?58o>(BJIz}=tn-;?$7|IFZzHCl z=2eA%$Tc-zs#u;($Pv`=e=`$QJ$N=A;aI;6C!OY4*@odT=rnC@L#+x)(<+%A>x5Je zaPkOZrD(H1S5TciJS8%}QaK5BLPDrLQn6UocdGs$Rq3=t*0Oux%5p)4>j%03QZs88 zvX!z6JBYlVc`gRR&Km=qa^CHs&nWYfi0#>U^K>aH4k2 z(3!~P{4+GREm2z-j_h~8pw*MHj|;ml?;G&J^}^a%U*h34Of!Mv*%&+YLFpP_q}Q`Y ztLwOA9UQs~iQXDrSWN^6ymzSv{KcXc7XpWHsKUhsEZqQ4H(XrH6F{%W1VtrzT0FSG z<`Q9Zew=OFUl%-tgx5V4)*~TvgGj-UzYN++EV_iT^a0WsIbKphSt~b7eY0u3>ucFs zF7}1t^Yt~lB46D=Up6F`eLveO+$-A*1;z0eN(s@WjeC^y$2@87#~w0yX|?gs_`#xc p+dYs_{w>vlAzOmUaz$-rVfiZPs4$}UPPyrLW&%`KSYWi`%6~Se^b-I8 delta 1477 zcmZuxZD<@t7@pa?T=vp7xn|Smx|?e*U-z9$)F^J#l#31RB__=kg2ZCsda+W9A8Ap% zAA(l|iBh!oi6AH?si0{o?WHSd+B3xdkW>&F5gNfC2ckbhf1KbCX%o+PcUoI+UD%m- z=J|MM-Wg_nmQRBR7z=JNHaN`~t79zWr=C3-eC$?OxGd7xEb@EZX+@9RAKpbxUu5lSH9SYXlWj<*}?$8~9 zuF^>33G`7rgXcRmpX_ApDCr*cT9YKpYZ4z3ZVZjug6eW)%}W{KK-tspZOnb`Lw_oPK6cZ!{%jK2-Cqe z*jJhPQg9RalM>EtLv2LmUW6l>KDFIWA6pdk5@D4)c>kur(l`=Pa3&)2TUK-_BI^mS zonO;hZ51d_SY`2IZ36RRC8C^-%2W_{RP&W~*lo7!f|^EuRO8FkDmWdL^={2>E59JP zpAc5L{By?zCS#r)icwk0HeoHQ?kYCfjc!c~a?)qV?tUz=ybpU~s^r~?Lot=^UQ0}= z$z(2DdoJz7Wx}$}_#vhqE;chZK=T{)NStKiem!+oFwJLVoUnBZb6D!Jg1~ZwJ=B?( zk1=ofiq$Xs8GD_gd+6^}q(lpz>s-Ty_+~71hj1+ZGk2k{Yr@EP<(=k~QRK4W~fj8vB`Xk%rCynh1vKv#kF{Hk@%ilRjFg?L_OyPY<%*9XWvR jl#H1JpK&MpAJ;HGnnEhojpAqn&CK^S!r$dVQ>yqc^@d)s diff --git a/Assets/FurnitureMiniature.cs b/Assets/FurnitureMiniature.cs index be4c75e..7cbfc0b 100755 --- a/Assets/FurnitureMiniature.cs +++ b/Assets/FurnitureMiniature.cs @@ -2,16 +2,12 @@ using System.Collections; public class FurnitureMiniature : MonoBehaviour { - public void Grab(Transform attachment) { + public void Grab() { transform.parent = null; foreach (var collider in GetComponentsInChildren()) { collider.enabled = false; } GetComponent().isKinematic = true; - - var mini = gameObject.AddComponent(); - mini.DestinationAttachment = attachment; - mini.Duration = 0.33f; } public void Release() { diff --git a/Assets/RightController.cs b/Assets/RightController.cs index 44bf79d..44ca02e 100755 --- a/Assets/RightController.cs +++ b/Assets/RightController.cs @@ -1,14 +1,17 @@ using UnityEngine; using System.Collections; using System; +using System.Collections.Generic; public class RightController : MonoBehaviour { public Transform MiniatureAttachmentPoint; SteamVR_LaserPointer laserPointer; SteamVR_ControllerEvents controllerEvents; + BoxCollider boxCollider; WarehouseColumn warehouse; + HashSet touchingItems = new HashSet(); GameObject heldItem; WarehouseRow whRow = null; @@ -48,11 +51,17 @@ public class RightController : MonoBehaviour { } } - RaycastHit raycast() { - var ray = new Ray(transform.position, transform.forward); - RaycastHit hit; - bool bHit = Physics.Raycast(ray, out hit); - return hit; + void OnTriggerEnter(Collider other) { + var mini = other.GetComponentInParent(); + if (mini == null) { + return; + } + + touchingItems.Add(other.gameObject); + } + + void OnTriggerExit(Collider other) { + touchingItems.Remove(other.gameObject); } // Furniture picking @@ -82,7 +91,28 @@ public class RightController : MonoBehaviour { } bool grabByProximity() { - return false; + GameObject closest = null; + foreach (var obj in touchingItems) { + if (closest == null) { + closest = obj; + continue; + } + + if ((obj.transform.position - boxCollider.bounds.center).magnitude < (closest.transform.position - boxCollider.bounds.center).magnitude) { + closest = obj; + } + } + + if (closest == null) { + return false; + } + + var mini = closest.GetComponentInParent(); + mini.Grab(); + mini.transform.parent = transform; + heldItem = mini.gameObject; + + return true; } bool grabByLaser() { @@ -98,18 +128,29 @@ public class RightController : MonoBehaviour { var warehouseItem = result.rigidbody.GetComponent(); if (warehouseItem) { var mini = warehouseItem.Pick(); - mini.Grab(MiniatureAttachmentPoint); - var anim = mini.GetComponent(); + mini.Grab(); + + var anim = mini.gameObject.AddComponent(); anim.OriginItem = warehouseItem; + anim.DestinationAttachment = MiniatureAttachmentPoint; anim.GoalScale = new Vector3(0.05f, 0.05f, 0.05f); + anim.Duration = 0.33f; + heldItem = mini.gameObject; + return true; } // Warehouse miniature grabbing remotely var furnitureMini = result.rigidbody.GetComponent(); if (furnitureMini) { - furnitureMini.Grab(MiniatureAttachmentPoint); + furnitureMini.Grab(); + + var anim = furnitureMini.gameObject.AddComponent(); + //anim.OriginItem = furnitureMini; + anim.DestinationAttachment = MiniatureAttachmentPoint; + anim.Duration = 0.33f; + heldItem = furnitureMini.gameObject; return true; } diff --git a/Assets/Test.unity b/Assets/Test.unity index 90a44d28a6f7f14c1f3db6f93c00b84954b53332..b11d8b9d227f7c5589ef86cdbdad6297f3c47382 100755 GIT binary patch delta 6585 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 Tz&czS<>u!_0{?a#zfbi)X{XwX