- ParticleSceneControls.cs
- Scripts /
- SampleScenes /
- Assets /
- project /
1 using System;
2 using System.Collections.Generic;
3 using UnityEngine;
4 using UnityEngine.EventSystems;
5 using UnityEngine.UI;
6 using UnityStandardAssets.Effects;
7
8
9 namespace UnityStandardAssets.SceneUtils
10 {
11 public class ParticleSceneControls : MonoBehaviour
12 {
13 public enum Mode
14 {
15 Activate,
16 Instantiate,
17 Trail
18 }
19
20 public enum AlignMode
21 {
22 Normal,
23 Up
24 }
25
26
27 public DemoParticleSystemList demoParticles;
28 public float spawnOffset = 0.5f;
29 public float multiply = 1;
30 public bool clearOnChange = false;
31 public Text titleText;
32 public Transform sceneCamera;
33 public Text instructionText;
34 public Button previousButton;
35 public Button nextButton;
36 public GraphicRaycaster graphicRaycaster;
37 public EventSystem eventSystem;
38
39
40 private ParticleSystemMultiplier m_ParticleMultiplier;
41 private List<Transform> m_CurrentParticleList = new List<Transform>();
42 private Transform m_Instance;
43 private static int s_SelectedIndex = 0;
44 private Vector3 m_CamOffsetVelocity = Vector3.zero;
45 private Vector3 m_LastPos;
46 private static DemoParticleSystem s_Selected;
47
48
49 private void Awake()
50 {
51 Select(s_SelectedIndex);
52
53 previousButton.onClick.AddListener(Previous);
54 nextButton.onClick.AddListener(Next);
55 }
56
57
58 private void OnDisable()
59 {
60 previousButton.onClick.RemoveListener (Previous);
61 nextButton.onClick.RemoveListener (Next);
62 }
63
64
65 private void Previous()
66 {
67 s_SelectedIndex--;
68 if (s_SelectedIndex == -1)
69 {
70 s_SelectedIndex = demoParticles.items.Length - 1;
71 }
72 Select(s_SelectedIndex);
73 }
74
75
76 public void Next()
77 {
78 s_SelectedIndex++;
79 if (s_SelectedIndex == demoParticles.items.Length)
80 {
81 s_SelectedIndex = 0;
82 }
83 Select(s_SelectedIndex);
84 }
85
86
87 private void Update()
88 {
89
90 #if !MOBILE_INPUT
91 KeyboardInput();
92 #endif
93
94
95
96 sceneCamera.localPosition = Vector3.SmoothDamp(sceneCamera.localPosition, Vector3.forward*-s_Selected.camOffset,
97 ref m_CamOffsetVelocity, 1);
98
99 if (s_Selected.mode == Mode.Activate)
100 {
101 // this is for a particle system that just needs activating, and needs no interaction (eg, duststorm)
102 return;
103 }
104
105 if (CheckForGuiCollision()) return;
106
107 bool oneShotClick = (Input.GetMouseButtonDown(0) && s_Selected.mode == Mode.Instantiate);
108 bool repeat = (Input.GetMouseButton(0) && s_Selected.mode == Mode.Trail);
109
110 if (oneShotClick || repeat)
111 {
112 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
113 RaycastHit hit;
114 if (Physics.Raycast(ray, out hit))
115 {
116 var rot = Quaternion.LookRotation(hit.normal);
117
118 if (s_Selected.align == AlignMode.Up)
119 {
120 rot = Quaternion.identity;
121 }
122
123 var pos = hit.point + hit.normal*spawnOffset;
124
125 if ((pos - m_LastPos).magnitude > s_Selected.minDist)
126 {
127 if (s_Selected.mode != Mode.Trail || m_Instance == null)
128 {
129 m_Instance = (Transform) Instantiate(s_Selected.transform, pos, rot);
130
131 if (m_ParticleMultiplier != null)
132 {
133 m_Instance.GetComponent<ParticleSystemMultiplier>().multiplier = multiply;
134 }
135
136 m_CurrentParticleList.Add(m_Instance);
137
138 if (s_Selected.maxCount > 0 && m_CurrentParticleList.Count > s_Selected.maxCount)
139 {
140 if (m_CurrentParticleList[0] != null)
141 {
142 Destroy(m_CurrentParticleList[0].gameObject);
143 }
144 m_CurrentParticleList.RemoveAt(0);
145 }
146 }
147 else
148 {
149 m_Instance.position = pos;
150 m_Instance.rotation = rot;
151 }
152
153 if (s_Selected.mode == Mode.Trail)
154 {
155 var emission = m_Instance.transform.GetComponent<ParticleSystem>().emission;
156 emission.enabled = false;
157 m_Instance.transform.GetComponent<ParticleSystem>().Emit(1);
158 }
159
160 m_Instance.parent = hit.transform;
161 m_LastPos = pos;
162 }
163 }
164 }
165 }
166
167
168 #if !MOBILE_INPUT
169 void KeyboardInput()
170 {
171 if(Input.GetKeyDown(KeyCode.LeftArrow))
172 Previous();
173
174 if (Input.GetKeyDown(KeyCode.RightArrow))
175 Next();
176 }
177 #endif
178
179
180 bool CheckForGuiCollision()
181 {
182 PointerEventData eventData = new PointerEventData(eventSystem);
183 eventData.pressPosition = Input.mousePosition;
184 eventData.position = Input.mousePosition;
185
186 List<RaycastResult> list = new List<RaycastResult>();
187 graphicRaycaster.Raycast(eventData, list);
188 return list.Count > 0;
189 }
190
191 private void Select(int i)
192 {
193 s_Selected = demoParticles.items[i];
194 m_Instance = null;
195 foreach (var otherEffect in demoParticles.items)
196 {
197 if ((otherEffect != s_Selected) && (otherEffect.mode == Mode.Activate))
198 {
199 otherEffect.transform.gameObject.SetActive(false);
200 }
201 }
202 if (s_Selected.mode == Mode.Activate)
203 {
204 s_Selected.transform.gameObject.SetActive(true);
205 }
206 m_ParticleMultiplier = s_Selected.transform.GetComponent<ParticleSystemMultiplier>();
207 multiply = 1;
208 if (clearOnChange)
209 {
210 while (m_CurrentParticleList.Count > 0)
211 {
212 Destroy(m_CurrentParticleList[0].gameObject);
213 m_CurrentParticleList.RemoveAt(0);
214 }
215 }
216
217 instructionText.text = s_Selected.instructionText;
218 titleText.text = s_Selected.transform.name;
219 }
220
221
222 [Serializable]
223 public class DemoParticleSystem
224 {
225 public Transform transform;
226 public Mode mode;
227 public AlignMode align;
228 public int maxCount;
229 public float minDist;
230 public int camOffset = 15;
231 public string instructionText;
232 }
233
234 [Serializable]
235 public class DemoParticleSystemList
236 {
237 public DemoParticleSystem[] items;
238 }
239 }
240 }
2 using System.Collections.Generic;
3 using UnityEngine;
4 using UnityEngine.EventSystems;
5 using UnityEngine.UI;
6 using UnityStandardAssets.Effects;
7
8
9 namespace UnityStandardAssets.SceneUtils
10 {
11 public class ParticleSceneControls : MonoBehaviour
12 {
13 public enum Mode
14 {
15 Activate,
16 Instantiate,
17 Trail
18 }
19
20 public enum AlignMode
21 {
22 Normal,
23 Up
24 }
25
26
27 public DemoParticleSystemList demoParticles;
28 public float spawnOffset = 0.5f;
29 public float multiply = 1;
30 public bool clearOnChange = false;
31 public Text titleText;
32 public Transform sceneCamera;
33 public Text instructionText;
34 public Button previousButton;
35 public Button nextButton;
36 public GraphicRaycaster graphicRaycaster;
37 public EventSystem eventSystem;
38
39
40 private ParticleSystemMultiplier m_ParticleMultiplier;
41 private List<Transform> m_CurrentParticleList = new List<Transform>();
42 private Transform m_Instance;
43 private static int s_SelectedIndex = 0;
44 private Vector3 m_CamOffsetVelocity = Vector3.zero;
45 private Vector3 m_LastPos;
46 private static DemoParticleSystem s_Selected;
47
48
49 private void Awake()
50 {
51 Select(s_SelectedIndex);
52
53 previousButton.onClick.AddListener(Previous);
54 nextButton.onClick.AddListener(Next);
55 }
56
57
58 private void OnDisable()
59 {
60 previousButton.onClick.RemoveListener (Previous);
61 nextButton.onClick.RemoveListener (Next);
62 }
63
64
65 private void Previous()
66 {
67 s_SelectedIndex--;
68 if (s_SelectedIndex == -1)
69 {
70 s_SelectedIndex = demoParticles.items.Length - 1;
71 }
72 Select(s_SelectedIndex);
73 }
74
75
76 public void Next()
77 {
78 s_SelectedIndex++;
79 if (s_SelectedIndex == demoParticles.items.Length)
80 {
81 s_SelectedIndex = 0;
82 }
83 Select(s_SelectedIndex);
84 }
85
86
87 private void Update()
88 {
89
90 #if !MOBILE_INPUT
91 KeyboardInput();
92 #endif
93
94
95
96 sceneCamera.localPosition = Vector3.SmoothDamp(sceneCamera.localPosition, Vector3.forward*-s_Selected.camOffset,
97 ref m_CamOffsetVelocity, 1);
98
99 if (s_Selected.mode == Mode.Activate)
100 {
101 // this is for a particle system that just needs activating, and needs no interaction (eg, duststorm)
102 return;
103 }
104
105 if (CheckForGuiCollision()) return;
106
107 bool oneShotClick = (Input.GetMouseButtonDown(0) && s_Selected.mode == Mode.Instantiate);
108 bool repeat = (Input.GetMouseButton(0) && s_Selected.mode == Mode.Trail);
109
110 if (oneShotClick || repeat)
111 {
112 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
113 RaycastHit hit;
114 if (Physics.Raycast(ray, out hit))
115 {
116 var rot = Quaternion.LookRotation(hit.normal);
117
118 if (s_Selected.align == AlignMode.Up)
119 {
120 rot = Quaternion.identity;
121 }
122
123 var pos = hit.point + hit.normal*spawnOffset;
124
125 if ((pos - m_LastPos).magnitude > s_Selected.minDist)
126 {
127 if (s_Selected.mode != Mode.Trail || m_Instance == null)
128 {
129 m_Instance = (Transform) Instantiate(s_Selected.transform, pos, rot);
130
131 if (m_ParticleMultiplier != null)
132 {
133 m_Instance.GetComponent<ParticleSystemMultiplier>().multiplier = multiply;
134 }
135
136 m_CurrentParticleList.Add(m_Instance);
137
138 if (s_Selected.maxCount > 0 && m_CurrentParticleList.Count > s_Selected.maxCount)
139 {
140 if (m_CurrentParticleList[0] != null)
141 {
142 Destroy(m_CurrentParticleList[0].gameObject);
143 }
144 m_CurrentParticleList.RemoveAt(0);
145 }
146 }
147 else
148 {
149 m_Instance.position = pos;
150 m_Instance.rotation = rot;
151 }
152
153 if (s_Selected.mode == Mode.Trail)
154 {
155 var emission = m_Instance.transform.GetComponent<ParticleSystem>().emission;
156 emission.enabled = false;
157 m_Instance.transform.GetComponent<ParticleSystem>().Emit(1);
158 }
159
160 m_Instance.parent = hit.transform;
161 m_LastPos = pos;
162 }
163 }
164 }
165 }
166
167
168 #if !MOBILE_INPUT
169 void KeyboardInput()
170 {
171 if(Input.GetKeyDown(KeyCode.LeftArrow))
172 Previous();
173
174 if (Input.GetKeyDown(KeyCode.RightArrow))
175 Next();
176 }
177 #endif
178
179
180 bool CheckForGuiCollision()
181 {
182 PointerEventData eventData = new PointerEventData(eventSystem);
183 eventData.pressPosition = Input.mousePosition;
184 eventData.position = Input.mousePosition;
185
186 List<RaycastResult> list = new List<RaycastResult>();
187 graphicRaycaster.Raycast(eventData, list);
188 return list.Count > 0;
189 }
190
191 private void Select(int i)
192 {
193 s_Selected = demoParticles.items[i];
194 m_Instance = null;
195 foreach (var otherEffect in demoParticles.items)
196 {
197 if ((otherEffect != s_Selected) && (otherEffect.mode == Mode.Activate))
198 {
199 otherEffect.transform.gameObject.SetActive(false);
200 }
201 }
202 if (s_Selected.mode == Mode.Activate)
203 {
204 s_Selected.transform.gameObject.SetActive(true);
205 }
206 m_ParticleMultiplier = s_Selected.transform.GetComponent<ParticleSystemMultiplier>();
207 multiply = 1;
208 if (clearOnChange)
209 {
210 while (m_CurrentParticleList.Count > 0)
211 {
212 Destroy(m_CurrentParticleList[0].gameObject);
213 m_CurrentParticleList.RemoveAt(0);
214 }
215 }
216
217 instructionText.text = s_Selected.instructionText;
218 titleText.text = s_Selected.transform.name;
219 }
220
221
222 [Serializable]
223 public class DemoParticleSystem
224 {
225 public Transform transform;
226 public Mode mode;
227 public AlignMode align;
228 public int maxCount;
229 public float minDist;
230 public int camOffset = 15;
231 public string instructionText;
232 }
233
234 [Serializable]
235 public class DemoParticleSystemList
236 {
237 public DemoParticleSystem[] items;
238 }
239 }
240 }