snipt

Ctrl+h for KB shortcuts

C#

SetGameObjectAsViewportLabel

//SetGameObjectasViewportLabel.cs v1.0.0
//Face Camera code from: http://wiki.unity3d.com/index.php?title=CameraFacingBillboard#Alternative_Mod
//made by holyfingers: http://hutonggames.com/playmakerforum/index.php?topic=11358.0

// __ECO__ __PLAYMAKER__ __ACTION__

using UnityEngine;
namespace HutongGames.PlayMaker.Actions
{
	[ActionCategory(ActionCategory.Camera)]
	[Tooltip("Sets the Position of a Game Object in Viewport space relative to another Game Object in World space.")]
	public class SetGameObjectAsViewportLabel : FsmStateAction
	{
		[RequiredField]
		[Tooltip("The GameObject to follow.")]
		public FsmOwnerDefault gameObject;
		[RequiredField]
		[Tooltip("The GameObject to transform.")]
		public FsmGameObject labelObject;
		[Tooltip("The GameObject to act as a Label.")]
		public Camera referenceCamera;
		[Tooltip("Offset the Label position in Viewport X.")]
		public FsmFloat viewportOffsetX;
		[Tooltip("Offset the Label position in Viewport Y.")]
		public FsmFloat viewportOffsetY;
		[Tooltip("Offset the Label position in Viewport Z.")]
		public FsmFloat viewportOffsetZ;
		[Tooltip("Aligns the Label object with the Viewport.")]
		public bool faceCamera = false;
		[Tooltip("Flips the Label.")]
		public bool flipLabel = false;
		[Tooltip("Repeat every frame.")]
		public bool everyFrame;
		[Tooltip("Perform in LateUpdate. This is useful if you want to override the position of objects that are animated or otherwise positioned in Update.")]
		public bool lateUpdate;


		public override void Reset()
		{
			labelObject = null;
			referenceCamera = null;
			// default axis to variable dropdown with None selected.
			viewportOffsetX = new FsmFloat { UseVariable = true };
			viewportOffsetY = new FsmFloat { UseVariable = true };
			viewportOffsetZ = 1;
			faceCamera = false;
			flipLabel = false;
			everyFrame = false;
			lateUpdate = false;
		}

		public override void OnEnter()
		{
			if (!everyFrame && !lateUpdate)
			{
				DoSetPositionInViewport();
				Finish();
			}		
		}
		
		public override void OnUpdate()
		{
			if (!lateUpdate)
			{ 
				DoSetPositionInViewport();
			}
		}
		
		public override void OnLateUpdate()
		{
			if (lateUpdate)
			{
				DoSetPositionInViewport();
			}
			
			if (!everyFrame)
			{ 
				Finish();
			}
		}
		
		void DoSetPositionInViewport()
		
		{
			Vector3 worldPosition;
			Vector3 viewPosition;
			Vector3 newWorldPosition;

			if (referenceCamera == null) 
			
			{
				referenceCamera = Camera.main;
			}

			//Get World position from target gameObject

			var go = Fsm.GetOwnerDefaultTarget (gameObject);

			if (go == null) {

				return;

			}

			worldPosition = go.transform.position;

			//Get View Position

			viewPosition = referenceCamera.WorldToViewportPoint(worldPosition);

			//Set New World Position
			
			if (!viewportOffsetX.IsNone) viewPosition.x = viewPosition.x + viewportOffsetX.Value;
			if (!viewportOffsetY.IsNone) viewPosition.y = viewPosition.y + viewportOffsetY.Value;
			if (!viewportOffsetZ.IsNone) viewPosition.z = viewportOffsetZ.Value;
			
			newWorldPosition = referenceCamera.ViewportToWorldPoint(viewPosition);

			labelObject.Value.transform.position = newWorldPosition;

			if (faceCamera ==true) {

				// rotates the object relative to the camera

				Vector3 targetPos = labelObject.Value.transform.position + referenceCamera.transform.rotation * (flipLabel ? Vector3.back : Vector3.forward);
				Vector3 targetOrientation = referenceCamera.transform.rotation * Vector3.up;
				labelObject.Value.transform.LookAt (targetPos, targetOrientation);

				}

			}

	}
}
https://snipt.net/embed/2d7a792dd4f00044f04839bea7a68648/
/raw/2d7a792dd4f00044f04839bea7a68648/
2d7a792dd4f00044f04839bea7a68648
csharp
C#
134
2019-06-18T04:54:36
True
False
False
Oct 13, 2015 at 10:09 AM
/api/public/snipt/141659/
setgameobjectasviewportlabel
<table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><a href="#L-1"> 1</a> <a href="#L-2"> 2</a> <a href="#L-3"> 3</a> <a href="#L-4"> 4</a> <a href="#L-5"> 5</a> <a href="#L-6"> 6</a> <a href="#L-7"> 7</a> <a href="#L-8"> 8</a> <a href="#L-9"> 9</a> <a href="#L-10"> 10</a> <a href="#L-11"> 11</a> <a href="#L-12"> 12</a> <a href="#L-13"> 13</a> <a href="#L-14"> 14</a> <a href="#L-15"> 15</a> <a href="#L-16"> 16</a> <a href="#L-17"> 17</a> <a href="#L-18"> 18</a> <a href="#L-19"> 19</a> <a href="#L-20"> 20</a> <a href="#L-21"> 21</a> <a href="#L-22"> 22</a> <a href="#L-23"> 23</a> <a href="#L-24"> 24</a> <a href="#L-25"> 25</a> <a href="#L-26"> 26</a> <a href="#L-27"> 27</a> <a href="#L-28"> 28</a> <a href="#L-29"> 29</a> <a href="#L-30"> 30</a> <a href="#L-31"> 31</a> <a href="#L-32"> 32</a> <a href="#L-33"> 33</a> <a href="#L-34"> 34</a> <a href="#L-35"> 35</a> <a href="#L-36"> 36</a> <a href="#L-37"> 37</a> <a href="#L-38"> 38</a> <a href="#L-39"> 39</a> <a href="#L-40"> 40</a> <a href="#L-41"> 41</a> <a href="#L-42"> 42</a> <a href="#L-43"> 43</a> <a href="#L-44"> 44</a> <a href="#L-45"> 45</a> <a href="#L-46"> 46</a> <a href="#L-47"> 47</a> <a href="#L-48"> 48</a> <a href="#L-49"> 49</a> <a href="#L-50"> 50</a> <a href="#L-51"> 51</a> <a href="#L-52"> 52</a> <a href="#L-53"> 53</a> <a href="#L-54"> 54</a> <a href="#L-55"> 55</a> <a href="#L-56"> 56</a> <a href="#L-57"> 57</a> <a href="#L-58"> 58</a> <a href="#L-59"> 59</a> <a href="#L-60"> 60</a> <a href="#L-61"> 61</a> <a href="#L-62"> 62</a> <a href="#L-63"> 63</a> <a href="#L-64"> 64</a> <a href="#L-65"> 65</a> <a href="#L-66"> 66</a> <a href="#L-67"> 67</a> <a href="#L-68"> 68</a> <a href="#L-69"> 69</a> <a href="#L-70"> 70</a> <a href="#L-71"> 71</a> <a href="#L-72"> 72</a> <a href="#L-73"> 73</a> <a href="#L-74"> 74</a> <a href="#L-75"> 75</a> <a href="#L-76"> 76</a> <a href="#L-77"> 77</a> <a href="#L-78"> 78</a> <a href="#L-79"> 79</a> <a href="#L-80"> 80</a> <a href="#L-81"> 81</a> <a href="#L-82"> 82</a> <a href="#L-83"> 83</a> <a href="#L-84"> 84</a> <a href="#L-85"> 85</a> <a href="#L-86"> 86</a> <a href="#L-87"> 87</a> <a href="#L-88"> 88</a> <a href="#L-89"> 89</a> <a href="#L-90"> 90</a> <a href="#L-91"> 91</a> <a href="#L-92"> 92</a> <a href="#L-93"> 93</a> <a href="#L-94"> 94</a> <a href="#L-95"> 95</a> <a href="#L-96"> 96</a> <a href="#L-97"> 97</a> <a href="#L-98"> 98</a> <a href="#L-99"> 99</a> <a href="#L-100">100</a> <a href="#L-101">101</a> <a href="#L-102">102</a> <a href="#L-103">103</a> <a href="#L-104">104</a> <a href="#L-105">105</a> <a href="#L-106">106</a> <a href="#L-107">107</a> <a href="#L-108">108</a> <a href="#L-109">109</a> <a href="#L-110">110</a> <a href="#L-111">111</a> <a href="#L-112">112</a> <a href="#L-113">113</a> <a href="#L-114">114</a> <a href="#L-115">115</a> <a href="#L-116">116</a> <a href="#L-117">117</a> <a href="#L-118">118</a> <a href="#L-119">119</a> <a href="#L-120">120</a> <a href="#L-121">121</a> <a href="#L-122">122</a> <a href="#L-123">123</a> <a href="#L-124">124</a> <a href="#L-125">125</a> <a href="#L-126">126</a> <a href="#L-127">127</a> <a href="#L-128">128</a> <a href="#L-129">129</a> <a href="#L-130">130</a> <a href="#L-131">131</a> <a href="#L-132">132</a> <a href="#L-133">133</a> <a href="#L-134">134</a></pre></div></td><td class="code"><div class="highlight"><pre><span></span><span id="L-1"><a name="L-1"></a><span class="c1">//SetGameObjectasViewportLabel.cs v1.0.0</span> </span><span id="L-2"><a name="L-2"></a><span class="c1">//Face Camera code from: http://wiki.unity3d.com/index.php?title=CameraFacingBillboard#Alternative_Mod</span> </span><span id="L-3"><a name="L-3"></a><span class="c1">//made by holyfingers: http://hutonggames.com/playmakerforum/index.php?topic=11358.0</span> </span><span id="L-4"><a name="L-4"></a> </span><span id="L-5"><a name="L-5"></a><span class="c1">// __ECO__ __PLAYMAKER__ __ACTION__</span> </span><span id="L-6"><a name="L-6"></a> </span><span id="L-7"><a name="L-7"></a><span class="k">using</span> <span class="nn">UnityEngine</span><span class="p">;</span> </span><span id="L-8"><a name="L-8"></a><span class="k">namespace</span> <span class="nn">HutongGames.PlayMaker.Actions</span> </span><span id="L-9"><a name="L-9"></a><span class="p">{</span> </span><span id="L-10"><a name="L-10"></a><span class="na"> [ActionCategory(ActionCategory.Camera)]</span> </span><span id="L-11"><a name="L-11"></a><span class="na"> [Tooltip(&quot;Sets the Position of a Game Object in Viewport space relative to another Game Object in World space.&quot;)]</span> </span><span id="L-12"><a name="L-12"></a> <span class="k">public</span> <span class="k">class</span> <span class="nc">SetGameObjectAsViewportLabel</span> <span class="p">:</span> <span class="n">FsmStateAction</span> </span><span id="L-13"><a name="L-13"></a> <span class="p">{</span> </span><span id="L-14"><a name="L-14"></a><span class="na"> [RequiredField]</span> </span><span id="L-15"><a name="L-15"></a><span class="na"> [Tooltip(&quot;The GameObject to follow.&quot;)]</span> </span><span id="L-16"><a name="L-16"></a> <span class="k">public</span> <span class="n">FsmOwnerDefault</span> <span class="n">gameObject</span><span class="p">;</span> </span><span id="L-17"><a name="L-17"></a><span class="na"> [RequiredField]</span> </span><span id="L-18"><a name="L-18"></a><span class="na"> [Tooltip(&quot;The GameObject to transform.&quot;)]</span> </span><span id="L-19"><a name="L-19"></a> <span class="k">public</span> <span class="n">FsmGameObject</span> <span class="n">labelObject</span><span class="p">;</span> </span><span id="L-20"><a name="L-20"></a><span class="na"> [Tooltip(&quot;The GameObject to act as a Label.&quot;)]</span> </span><span id="L-21"><a name="L-21"></a> <span class="k">public</span> <span class="n">Camera</span> <span class="n">referenceCamera</span><span class="p">;</span> </span><span id="L-22"><a name="L-22"></a><span class="na"> [Tooltip(&quot;Offset the Label position in Viewport X.&quot;)]</span> </span><span id="L-23"><a name="L-23"></a> <span class="k">public</span> <span class="n">FsmFloat</span> <span class="n">viewportOffsetX</span><span class="p">;</span> </span><span id="L-24"><a name="L-24"></a><span class="na"> [Tooltip(&quot;Offset the Label position in Viewport Y.&quot;)]</span> </span><span id="L-25"><a name="L-25"></a> <span class="k">public</span> <span class="n">FsmFloat</span> <span class="n">viewportOffsetY</span><span class="p">;</span> </span><span id="L-26"><a name="L-26"></a><span class="na"> [Tooltip(&quot;Offset the Label position in Viewport Z.&quot;)]</span> </span><span id="L-27"><a name="L-27"></a> <span class="k">public</span> <span class="n">FsmFloat</span> <span class="n">viewportOffsetZ</span><span class="p">;</span> </span><span id="L-28"><a name="L-28"></a><span class="na"> [Tooltip(&quot;Aligns the Label object with the Viewport.&quot;)]</span> </span><span id="L-29"><a name="L-29"></a> <span class="k">public</span> <span class="kt">bool</span> <span class="n">faceCamera</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> </span><span id="L-30"><a name="L-30"></a><span class="na"> [Tooltip(&quot;Flips the Label.&quot;)]</span> </span><span id="L-31"><a name="L-31"></a> <span class="k">public</span> <span class="kt">bool</span> <span class="n">flipLabel</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> </span><span id="L-32"><a name="L-32"></a><span class="na"> [Tooltip(&quot;Repeat every frame.&quot;)]</span> </span><span id="L-33"><a name="L-33"></a> <span class="k">public</span> <span class="kt">bool</span> <span class="n">everyFrame</span><span class="p">;</span> </span><span id="L-34"><a name="L-34"></a><span class="na"> [Tooltip(&quot;Perform in LateUpdate. This is useful if you want to override the position of objects that are animated or otherwise positioned in Update.&quot;)]</span> </span><span id="L-35"><a name="L-35"></a> <span class="k">public</span> <span class="kt">bool</span> <span class="n">lateUpdate</span><span class="p">;</span> </span><span id="L-36"><a name="L-36"></a> </span><span id="L-37"><a name="L-37"></a> </span><span id="L-38"><a name="L-38"></a> <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">Reset</span><span class="p">()</span> </span><span id="L-39"><a name="L-39"></a> <span class="p">{</span> </span><span id="L-40"><a name="L-40"></a> <span class="n">labelObject</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span> </span><span id="L-41"><a name="L-41"></a> <span class="n">referenceCamera</span> <span class="p">=</span> <span class="k">null</span><span class="p">;</span> </span><span id="L-42"><a name="L-42"></a> <span class="c1">// default axis to variable dropdown with None selected.</span> </span><span id="L-43"><a name="L-43"></a> <span class="n">viewportOffsetX</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FsmFloat</span> <span class="p">{</span> <span class="n">UseVariable</span> <span class="p">=</span> <span class="k">true</span> <span class="p">};</span> </span><span id="L-44"><a name="L-44"></a> <span class="n">viewportOffsetY</span> <span class="p">=</span> <span class="k">new</span> <span class="n">FsmFloat</span> <span class="p">{</span> <span class="n">UseVariable</span> <span class="p">=</span> <span class="k">true</span> <span class="p">};</span> </span><span id="L-45"><a name="L-45"></a> <span class="n">viewportOffsetZ</span> <span class="p">=</span> <span class="m">1</span><span class="p">;</span> </span><span id="L-46"><a name="L-46"></a> <span class="n">faceCamera</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> </span><span id="L-47"><a name="L-47"></a> <span class="n">flipLabel</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> </span><span id="L-48"><a name="L-48"></a> <span class="n">everyFrame</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> </span><span id="L-49"><a name="L-49"></a> <span class="n">lateUpdate</span> <span class="p">=</span> <span class="k">false</span><span class="p">;</span> </span><span id="L-50"><a name="L-50"></a> <span class="p">}</span> </span><span id="L-51"><a name="L-51"></a> </span><span id="L-52"><a name="L-52"></a> <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnEnter</span><span class="p">()</span> </span><span id="L-53"><a name="L-53"></a> <span class="p">{</span> </span><span id="L-54"><a name="L-54"></a> <span class="k">if</span> <span class="p">(!</span><span class="n">everyFrame</span> <span class="p">&amp;&amp;</span> <span class="p">!</span><span class="n">lateUpdate</span><span class="p">)</span> </span><span id="L-55"><a name="L-55"></a> <span class="p">{</span> </span><span id="L-56"><a name="L-56"></a> <span class="n">DoSetPositionInViewport</span><span class="p">();</span> </span><span id="L-57"><a name="L-57"></a> <span class="n">Finish</span><span class="p">();</span> </span><span id="L-58"><a name="L-58"></a> <span class="p">}</span> </span><span id="L-59"><a name="L-59"></a> <span class="p">}</span> </span><span id="L-60"><a name="L-60"></a> </span><span id="L-61"><a name="L-61"></a> <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnUpdate</span><span class="p">()</span> </span><span id="L-62"><a name="L-62"></a> <span class="p">{</span> </span><span id="L-63"><a name="L-63"></a> <span class="k">if</span> <span class="p">(!</span><span class="n">lateUpdate</span><span class="p">)</span> </span><span id="L-64"><a name="L-64"></a> <span class="p">{</span> </span><span id="L-65"><a name="L-65"></a> <span class="n">DoSetPositionInViewport</span><span class="p">();</span> </span><span id="L-66"><a name="L-66"></a> <span class="p">}</span> </span><span id="L-67"><a name="L-67"></a> <span class="p">}</span> </span><span id="L-68"><a name="L-68"></a> </span><span id="L-69"><a name="L-69"></a> <span class="k">public</span> <span class="k">override</span> <span class="k">void</span> <span class="nf">OnLateUpdate</span><span class="p">()</span> </span><span id="L-70"><a name="L-70"></a> <span class="p">{</span> </span><span id="L-71"><a name="L-71"></a> <span class="k">if</span> <span class="p">(</span><span class="n">lateUpdate</span><span class="p">)</span> </span><span id="L-72"><a name="L-72"></a> <span class="p">{</span> </span><span id="L-73"><a name="L-73"></a> <span class="n">DoSetPositionInViewport</span><span class="p">();</span> </span><span id="L-74"><a name="L-74"></a> <span class="p">}</span> </span><span id="L-75"><a name="L-75"></a> </span><span id="L-76"><a name="L-76"></a> <span class="k">if</span> <span class="p">(!</span><span class="n">everyFrame</span><span class="p">)</span> </span><span id="L-77"><a name="L-77"></a> <span class="p">{</span> </span><span id="L-78"><a name="L-78"></a> <span class="n">Finish</span><span class="p">();</span> </span><span id="L-79"><a name="L-79"></a> <span class="p">}</span> </span><span id="L-80"><a name="L-80"></a> <span class="p">}</span> </span><span id="L-81"><a name="L-81"></a> </span><span id="L-82"><a name="L-82"></a> <span class="k">void</span> <span class="nf">DoSetPositionInViewport</span><span class="p">()</span> </span><span id="L-83"><a name="L-83"></a> </span><span id="L-84"><a name="L-84"></a> <span class="p">{</span> </span><span id="L-85"><a name="L-85"></a> <span class="n">Vector3</span> <span class="n">worldPosition</span><span class="p">;</span> </span><span id="L-86"><a name="L-86"></a> <span class="n">Vector3</span> <span class="n">viewPosition</span><span class="p">;</span> </span><span id="L-87"><a name="L-87"></a> <span class="n">Vector3</span> <span class="n">newWorldPosition</span><span class="p">;</span> </span><span id="L-88"><a name="L-88"></a> </span><span id="L-89"><a name="L-89"></a> <span class="k">if</span> <span class="p">(</span><span class="n">referenceCamera</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> </span><span id="L-90"><a name="L-90"></a> </span><span id="L-91"><a name="L-91"></a> <span class="p">{</span> </span><span id="L-92"><a name="L-92"></a> <span class="n">referenceCamera</span> <span class="p">=</span> <span class="n">Camera</span><span class="p">.</span><span class="n">main</span><span class="p">;</span> </span><span id="L-93"><a name="L-93"></a> <span class="p">}</span> </span><span id="L-94"><a name="L-94"></a> </span><span id="L-95"><a name="L-95"></a> <span class="c1">//Get World position from target gameObject</span> </span><span id="L-96"><a name="L-96"></a> </span><span id="L-97"><a name="L-97"></a> <span class="kt">var</span> <span class="n">go</span> <span class="p">=</span> <span class="n">Fsm</span><span class="p">.</span><span class="n">GetOwnerDefaultTarget</span> <span class="p">(</span><span class="n">gameObject</span><span class="p">);</span> </span><span id="L-98"><a name="L-98"></a> </span><span id="L-99"><a name="L-99"></a> <span class="k">if</span> <span class="p">(</span><span class="n">go</span> <span class="p">==</span> <span class="k">null</span><span class="p">)</span> <span class="p">{</span> </span><span id="L-100"><a name="L-100"></a> </span><span id="L-101"><a name="L-101"></a> <span class="k">return</span><span class="p">;</span> </span><span id="L-102"><a name="L-102"></a> </span><span id="L-103"><a name="L-103"></a> <span class="p">}</span> </span><span id="L-104"><a name="L-104"></a> </span><span id="L-105"><a name="L-105"></a> <span class="n">worldPosition</span> <span class="p">=</span> <span class="n">go</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">position</span><span class="p">;</span> </span><span id="L-106"><a name="L-106"></a> </span><span id="L-107"><a name="L-107"></a> <span class="c1">//Get View Position</span> </span><span id="L-108"><a name="L-108"></a> </span><span id="L-109"><a name="L-109"></a> <span class="n">viewPosition</span> <span class="p">=</span> <span class="n">referenceCamera</span><span class="p">.</span><span class="n">WorldToViewportPoint</span><span class="p">(</span><span class="n">worldPosition</span><span class="p">);</span> </span><span id="L-110"><a name="L-110"></a> </span><span id="L-111"><a name="L-111"></a> <span class="c1">//Set New World Position</span> </span><span id="L-112"><a name="L-112"></a> </span><span id="L-113"><a name="L-113"></a> <span class="k">if</span> <span class="p">(!</span><span class="n">viewportOffsetX</span><span class="p">.</span><span class="n">IsNone</span><span class="p">)</span> <span class="n">viewPosition</span><span class="p">.</span><span class="n">x</span> <span class="p">=</span> <span class="n">viewPosition</span><span class="p">.</span><span class="n">x</span> <span class="p">+</span> <span class="n">viewportOffsetX</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span> </span><span id="L-114"><a name="L-114"></a> <span class="k">if</span> <span class="p">(!</span><span class="n">viewportOffsetY</span><span class="p">.</span><span class="n">IsNone</span><span class="p">)</span> <span class="n">viewPosition</span><span class="p">.</span><span class="n">y</span> <span class="p">=</span> <span class="n">viewPosition</span><span class="p">.</span><span class="n">y</span> <span class="p">+</span> <span class="n">viewportOffsetY</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span> </span><span id="L-115"><a name="L-115"></a> <span class="k">if</span> <span class="p">(!</span><span class="n">viewportOffsetZ</span><span class="p">.</span><span class="n">IsNone</span><span class="p">)</span> <span class="n">viewPosition</span><span class="p">.</span><span class="n">z</span> <span class="p">=</span> <span class="n">viewportOffsetZ</span><span class="p">.</span><span class="n">Value</span><span class="p">;</span> </span><span id="L-116"><a name="L-116"></a> </span><span id="L-117"><a name="L-117"></a> <span class="n">newWorldPosition</span> <span class="p">=</span> <span class="n">referenceCamera</span><span class="p">.</span><span class="n">ViewportToWorldPoint</span><span class="p">(</span><span class="n">viewPosition</span><span class="p">);</span> </span><span id="L-118"><a name="L-118"></a> </span><span id="L-119"><a name="L-119"></a> <span class="n">labelObject</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">position</span> <span class="p">=</span> <span class="n">newWorldPosition</span><span class="p">;</span> </span><span id="L-120"><a name="L-120"></a> </span><span id="L-121"><a name="L-121"></a> <span class="k">if</span> <span class="p">(</span><span class="n">faceCamera</span> <span class="p">==</span><span class="k">true</span><span class="p">)</span> <span class="p">{</span> </span><span id="L-122"><a name="L-122"></a> </span><span id="L-123"><a name="L-123"></a> <span class="c1">// rotates the object relative to the camera</span> </span><span id="L-124"><a name="L-124"></a> </span><span id="L-125"><a name="L-125"></a> <span class="n">Vector3</span> <span class="n">targetPos</span> <span class="p">=</span> <span class="n">labelObject</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">position</span> <span class="p">+</span> <span class="n">referenceCamera</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">rotation</span> <span class="p">*</span> <span class="p">(</span><span class="n">flipLabel</span> <span class="p">?</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">back</span> <span class="p">:</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">forward</span><span class="p">);</span> </span><span id="L-126"><a name="L-126"></a> <span class="n">Vector3</span> <span class="n">targetOrientation</span> <span class="p">=</span> <span class="n">referenceCamera</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">rotation</span> <span class="p">*</span> <span class="n">Vector3</span><span class="p">.</span><span class="n">up</span><span class="p">;</span> </span><span id="L-127"><a name="L-127"></a> <span class="n">labelObject</span><span class="p">.</span><span class="n">Value</span><span class="p">.</span><span class="n">transform</span><span class="p">.</span><span class="n">LookAt</span> <span class="p">(</span><span class="n">targetPos</span><span class="p">,</span> <span class="n">targetOrientation</span><span class="p">);</span> </span><span id="L-128"><a name="L-128"></a> </span><span id="L-129"><a name="L-129"></a> <span class="p">}</span> </span><span id="L-130"><a name="L-130"></a> </span><span id="L-131"><a name="L-131"></a> <span class="p">}</span> </span><span id="L-132"><a name="L-132"></a> </span><span id="L-133"><a name="L-133"></a> <span class="p">}</span> </span><span id="L-134"><a name="L-134"></a><span class="p">}</span> </span></pre></div> </td></tr></table>
ActionCategory.Effects, Ecosystem, Playmaker, Unity3
--- 
+++ 
@@ -0,0 +1,134 @@
+//SetGameObjectasViewportLabel.cs v1.0.0
+//Face Camera code from: http://wiki.unity3d.com/index.php?title=CameraFacingBillboard#Alternative_Mod
+//made by holyfingers: http://hutonggames.com/playmakerforum/index.php?topic=11358.0
+
+// __ECO__ __PLAYMAKER__ __ACTION__
+
+using UnityEngine;
+namespace HutongGames.PlayMaker.Actions
+{
+	[ActionCategory(ActionCategory.Camera)]
+	[Tooltip("Sets the Position of a Game Object in Viewport space relative to another Game Object in World space.")]
+	public class SetGameObjectAsViewportLabel : FsmStateAction
+	{
+		[RequiredField]
+		[Tooltip("The GameObject to follow.")]
+		public FsmOwnerDefault gameObject;
+		[RequiredField]
+		[Tooltip("The GameObject to transform.")]
+		public FsmGameObject labelObject;
+		[Tooltip("The GameObject to act as a Label.")]
+		public Camera referenceCamera;
+		[Tooltip("Offset the Label position in Viewport X.")]
+		public FsmFloat viewportOffsetX;
+		[Tooltip("Offset the Label position in Viewport Y.")]
+		public FsmFloat viewportOffsetY;
+		[Tooltip("Offset the Label position in Viewport Z.")]
+		public FsmFloat viewportOffsetZ;
+		[Tooltip("Aligns the Label object with the Viewport.")]
+		public bool faceCamera = false;
+		[Tooltip("Flips the Label.")]
+		public bool flipLabel = false;
+		[Tooltip("Repeat every frame.")]
+		public bool everyFrame;
+		[Tooltip("Perform in LateUpdate. This is useful if you want to override the position of objects that are animated or otherwise positioned in Update.")]
+		public bool lateUpdate;
+
+
+		public override void Reset()
+		{
+			labelObject = null;
+			referenceCamera = null;
+			// default axis to variable dropdown with None selected.
+			viewportOffsetX = new FsmFloat { UseVariable = true };
+			viewportOffsetY = new FsmFloat { UseVariable = true };
+			viewportOffsetZ = 1;
+			faceCamera = false;
+			flipLabel = false;
+			everyFrame = false;
+			lateUpdate = false;
+		}
+
+		public override void OnEnter()
+		{
+			if (!everyFrame && !lateUpdate)
+			{
+				DoSetPositionInViewport();
+				Finish();
+			}		
+		}
+		
+		public override void OnUpdate()
+		{
+			if (!lateUpdate)
+			{ 
+				DoSetPositionInViewport();
+			}
+		}
+		
+		public override void OnLateUpdate()
+		{
+			if (lateUpdate)
+			{
+				DoSetPositionInViewport();
+			}
+			
+			if (!everyFrame)
+			{ 
+				Finish();
+			}
+		}
+		
+		void DoSetPositionInViewport()
+		
+		{
+			Vector3 worldPosition;
+			Vector3 viewPosition;
+			Vector3 newWorldPosition;
+
+			if (referenceCamera == null) 
+			
+			{
+				referenceCamera = Camera.main;
+			}
+
+			//Get World position from target gameObject
+
+			var go = Fsm.GetOwnerDefaultTarget (gameObject);
+
+			if (go == null) {
+
+				return;
+
+			}
+
+			worldPosition = go.transform.position;
+
+			//Get View Position
+
+			viewPosition = referenceCamera.WorldToViewportPoint(worldPosition);
+
+			//Set New World Position
+			
+			if (!viewportOffsetX.IsNone) viewPosition.x = viewPosition.x + viewportOffsetX.Value;
+			if (!viewportOffsetY.IsNone) viewPosition.y = viewPosition.y + viewportOffsetY.Value;
+			if (!viewportOffsetZ.IsNone) viewPosition.z = viewportOffsetZ.Value;
+			
+			newWorldPosition = referenceCamera.ViewportToWorldPoint(viewPosition);
+
+			labelObject.Value.transform.position = newWorldPosition;
+
+			if (faceCamera ==true) {
+
+				// rotates the object relative to the camera
+
+				Vector3 targetPos = labelObject.Value.transform.position + referenceCamera.transform.rotation * (flipLabel ? Vector3.back : Vector3.forward);
+				Vector3 targetOrientation = referenceCamera.transform.rotation * Vector3.up;
+				labelObject.Value.transform.LookAt (targetPos, targetOrientation);
+
+				}
+
+			}
+
+	}
+}