| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- using System;
- using System.Collections.Generic;
- using UnityEngine;
- using UnityEngine.EventSystems;
- using UnityEngine.UI;
- using UnityStandardAssets.Effects;
- namespace UnityStandardAssets.SceneUtils
- {
- public class ParticleSceneControls : MonoBehaviour
- {
- public enum Mode
- {
- Activate,
- Instantiate,
- Trail
- }
- public enum AlignMode
- {
- Normal,
- Up
- }
- public DemoParticleSystemList demoParticles;
- public float spawnOffset = 0.5f;
- public float multiply = 1;
- public bool clearOnChange = false;
- public Text titleText;
- public Transform sceneCamera;
- public Text instructionText;
- public Button previousButton;
- public Button nextButton;
- public GraphicRaycaster graphicRaycaster;
- public EventSystem eventSystem;
- private ParticleSystemMultiplier m_ParticleMultiplier;
- private List<Transform> m_CurrentParticleList = new List<Transform>();
- private Transform m_Instance;
- private static int s_SelectedIndex = 0;
- private Vector3 m_CamOffsetVelocity = Vector3.zero;
- private Vector3 m_LastPos;
- private static DemoParticleSystem s_Selected;
- private void Awake()
- {
- Select(s_SelectedIndex);
- previousButton.onClick.AddListener(Previous);
- nextButton.onClick.AddListener(Next);
- }
- private void OnDisable()
- {
- previousButton.onClick.RemoveListener (Previous);
- nextButton.onClick.RemoveListener (Next);
- }
- private void Previous()
- {
- s_SelectedIndex--;
- if (s_SelectedIndex == -1)
- {
- s_SelectedIndex = demoParticles.items.Length - 1;
- }
- Select(s_SelectedIndex);
- }
- public void Next()
- {
- s_SelectedIndex++;
- if (s_SelectedIndex == demoParticles.items.Length)
- {
- s_SelectedIndex = 0;
- }
- Select(s_SelectedIndex);
- }
- private void Update()
- {
- #if !MOBILE_INPUT
- KeyboardInput();
- #endif
- sceneCamera.localPosition = Vector3.SmoothDamp(sceneCamera.localPosition, Vector3.forward*-s_Selected.camOffset,
- ref m_CamOffsetVelocity, 1);
- if (s_Selected.mode == Mode.Activate)
- {
- // this is for a particle system that just needs activating, and needs no interaction (eg, duststorm)
- return;
- }
- if (CheckForGuiCollision()) return;
- bool oneShotClick = (Input.GetMouseButtonDown(0) && s_Selected.mode == Mode.Instantiate);
- bool repeat = (Input.GetMouseButton(0) && s_Selected.mode == Mode.Trail);
- if (oneShotClick || repeat)
- {
- Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
- RaycastHit hit;
- if (Physics.Raycast(ray, out hit))
- {
- var rot = Quaternion.LookRotation(hit.normal);
- if (s_Selected.align == AlignMode.Up)
- {
- rot = Quaternion.identity;
- }
- var pos = hit.point + hit.normal*spawnOffset;
- if ((pos - m_LastPos).magnitude > s_Selected.minDist)
- {
- if (s_Selected.mode != Mode.Trail || m_Instance == null)
- {
- m_Instance = (Transform) Instantiate(s_Selected.transform, pos, rot);
- if (m_ParticleMultiplier != null)
- {
- m_Instance.GetComponent<ParticleSystemMultiplier>().multiplier = multiply;
- }
- m_CurrentParticleList.Add(m_Instance);
- if (s_Selected.maxCount > 0 && m_CurrentParticleList.Count > s_Selected.maxCount)
- {
- if (m_CurrentParticleList[0] != null)
- {
- Destroy(m_CurrentParticleList[0].gameObject);
- }
- m_CurrentParticleList.RemoveAt(0);
- }
- }
- else
- {
- m_Instance.position = pos;
- m_Instance.rotation = rot;
- }
- if (s_Selected.mode == Mode.Trail)
- {
- var emission = m_Instance.transform.GetComponent<ParticleSystem>().emission;
- emission.enabled = false;
- m_Instance.transform.GetComponent<ParticleSystem>().Emit(1);
- }
- m_Instance.parent = hit.transform;
- m_LastPos = pos;
- }
- }
- }
- }
- #if !MOBILE_INPUT
- void KeyboardInput()
- {
- if(Input.GetKeyDown(KeyCode.LeftArrow))
- Previous();
- if (Input.GetKeyDown(KeyCode.RightArrow))
- Next();
- }
- #endif
- bool CheckForGuiCollision()
- {
- PointerEventData eventData = new PointerEventData(eventSystem);
- eventData.pressPosition = Input.mousePosition;
- eventData.position = Input.mousePosition;
- List<RaycastResult> list = new List<RaycastResult>();
- graphicRaycaster.Raycast(eventData, list);
- return list.Count > 0;
- }
- private void Select(int i)
- {
- s_Selected = demoParticles.items[i];
- m_Instance = null;
- foreach (var otherEffect in demoParticles.items)
- {
- if ((otherEffect != s_Selected) && (otherEffect.mode == Mode.Activate))
- {
- otherEffect.transform.gameObject.SetActive(false);
- }
- }
- if (s_Selected.mode == Mode.Activate)
- {
- s_Selected.transform.gameObject.SetActive(true);
- }
- m_ParticleMultiplier = s_Selected.transform.GetComponent<ParticleSystemMultiplier>();
- multiply = 1;
- if (clearOnChange)
- {
- while (m_CurrentParticleList.Count > 0)
- {
- Destroy(m_CurrentParticleList[0].gameObject);
- m_CurrentParticleList.RemoveAt(0);
- }
- }
- instructionText.text = s_Selected.instructionText;
- titleText.text = s_Selected.transform.name;
- }
- [Serializable]
- public class DemoParticleSystem
- {
- public Transform transform;
- public Mode mode;
- public AlignMode align;
- public int maxCount;
- public float minDist;
- public int camOffset = 15;
- public string instructionText;
- }
- [Serializable]
- public class DemoParticleSystemList
- {
- public DemoParticleSystem[] items;
- }
- }
- }
|