예제 #1
0
    public SpiralParticle CreateParticle()
    {
        SpiralParticle particle = Instantiate <SpiralParticle>(defaultParticle);

        particle.transform.SetParent(transform, false);
        SerializableManager.Deserialize <SpiralParticle>(particle, defaultParticle.ToJSON());
        return(particle);
    }
예제 #2
0
 public void OnParticlePaste()
 {
     if (DataManager.Instance.CopiedObject is SpiralParticle)
     {
         SpiralParticle copied = DataManager.Instance.CopiedObject as SpiralParticle;
         SerializableManager.Deserialize <SpiralParticle>(CurrentGroup.Particle, copied.ToJSON());
         DataManager.Instance.CopiedObject = null;
         UIManager.TriggerRefresh();
     }
 }
예제 #3
0
 public void RegisterParticle(SpiralParticle particle)
 {
     if (playing)
     {
         particles.Add(particle);
     }
     else
     {
         Destroy(particle.gameObject);
     }
 }
예제 #4
0
    void branch()
    {
        Children++;

        SpiralParticle child = GameObject.Instantiate(this, transform.position, transform.rotation) as SpiralParticle;

        child.TargetChildren = TargetChildren;
        child.TargetLength   = TargetLength * ChildLengthMultiplier;
        child.Width          = Mathf.Lerp(Width, Width * Tapering, Length / TargetLength);

        child.Arc          *= ChildArcMultiplier;
        child.Curl         *= ChildCurlMultiplier;
        child.CurlVelocity *= ChildCurlMultiplier;
        child.ChildDepthLimit--;

        child.transform.Rotate(Vector3.forward, ChildRotation, Space.World);
        child.Init();
    }
예제 #5
0
    public Material Generate(SpiralParticle particlePrefab, Color c, float depth = 0f)
    {
        Material particleMaterial = null;

        for (int i = 0; i < Spokes; i++)
        {
            Vector3 direction = Vector2.zero;
            direction.x = Mathf.Cos(Mathf.PI * 2f * (i / (float)Spokes) + PatternRotation * Mathf.Deg2Rad);
            direction.y = Mathf.Sin(Mathf.PI * 2f * (i / (float)Spokes) + PatternRotation * Mathf.Deg2Rad);

            for (int j = 0; j < SpiralsPerSpoke; j++)
            {
                SpiralParticle particle = GameObject.Instantiate <SpiralParticle>(particlePrefab);
                if (particleMaterial == null)
                {
                    particleMaterial       = new Material(particle.Trail.sharedMaterial);
                    particleMaterial.color = c;
                }
                particle.SetMaterial(particleMaterial);
                particle.TargetLength  *= Mathf.Pow(SpokeLengthMultiplier, j);
                particle.Velocity      *= Mathf.Pow(SpokeLengthMultiplier, j);
                particle.Arc           *= Mathf.Pow(SpokeArcMultiplier, j);
                particle.Curl          *= Mathf.Pow(SpokeCurlMultiplier, j);
                particle.ChildRotation *= Mathf.Pow(Mathf.Sign(SpokeArcMultiplier), j);
                float selfRotation = SpokeRotation * Mathf.Pow(Mathf.Sign(SpokeArcMultiplier), j);

                Vector3 forward = Vector2.zero;
                forward.x = Mathf.Cos(Mathf.PI * 2f * (i / (float)Spokes) + (PatternRotation + selfRotation) * Mathf.Deg2Rad);
                forward.y = Mathf.Sin(Mathf.PI * 2f * (i / (float)Spokes) + (PatternRotation + selfRotation) * Mathf.Deg2Rad);

                particle.transform.rotation = Quaternion.LookRotation(Vector3.forward, forward);
                if (SpokeDistance > 0)
                {
                    particle.transform.position += direction * SpokeDistance;
                }
                particle.transform.position -= Vector3.forward * depth;

                particle.Init();
            }
        }
        return(particleMaterial);
    }
예제 #6
0
    public void LoadParticle(SpiralParticle particle)
    {
        editingParticle = particle;
        isLoading       = true;

        Name.text = particle.name;

        Width.SetValue(particle.Width);
        Tapering.SetValue(particle.Tapering * 100f);

        Length.SetValue(particle.TargetLength);
        Arc.SetValue(particle.Arc);
        Curl.SetValue(particle.Curl);

        OffshootCount.SetValue(particle.TargetChildren);
        OffshootDepth.SetValue(particle.ChildDepthLimit);
        OffshootSpread.SetValue(particle.ChildSpread);
        OffshootRotate.SetValue(particle.ChildRotation);

        OffshootLengthMultiplier.SetValue(particle.ChildLengthMultiplier * 100f);
        OffshootArcMultiplier.SetValue(particle.ChildArcMultiplier * 100f);
        OffshootCurlMultiplier.SetValue(particle.ChildCurlMultiplier * 100f);
        isLoading = false;
    }
예제 #7
0
    // Update is called once per frame
    void Update()
    {
        // Play 와 Stop 처리 시작 ============================================
        // play가 아니였다가 play 상태로 된 경우
        if (play && play != playBeforeFrame)
        {
            playStartTime = Time.time;
            spawnedCount  = 0;
        }

        // play 상황이 아니면 그냥 리턴
        if (!play)
        {
            playBeforeFrame = play;
            return;
        }

        // play가 정해진 시간을 넘어서면 자동 stop 처리
        if (((Time.time - playStartTime) > spawnEndTime) && !spawnEndUnlimited)
        {
            play = false;
        }

        playBeforeFrame = play;
        // Play 와 Stop 처리 끝 ============================================

        // Spawn 시작
        // play 시작순간부터 현재 시간까지 전부 몇 개 스폰되었어야하는지 총 량 계산
        int totalSpawnCount = Mathf.FloorToInt((Time.time - playStartTime) / (1.0f / spawnRate)) + 1;
        // 총 스폰되었어야 할 카운트에서 그동안 스폰된 카운트를 빼면 현재 스폰해야할 카운트가 계산됨
        int nowSpawnCount = totalSpawnCount - spawnedCount;

        if (nowSpawnCount != 0)
        {
            for (int i = 0; i < nowSpawnCount; i++)
            {
                // 초기화
                GameObject newParticle = (GameObject.Instantiate(particle, meTransform.position, meTransform.localRotation)) as GameObject;
                if (inheritScale)
                {
                    newParticle.transform.localScale = meTransform.localScale;
                }
                SpiralParticle spiralParticle = newParticle.GetComponent <SpiralParticle>();
                spiralParticle.emitter = meTransform;
                spiralParticle.emitterPositionConstraint    = emitterPositionConstraint;
                spiralParticle.emitterOrientationConstraint = emitterOrientationConstraint;
                SpiralRotate spiralRotate = newParticle.transform.GetComponentInChildren <SpiralRotate>();
                if (!spiralParticle)    // 필요 컴포넌트가 없는 경우 그냥 리턴
                {
                    return;
                }

                // Life 설정
                spiralParticle.life         = Random.Range(lifeMinMax.x, lifeMinMax.y);
                spiralParticle.destroyDelay = destroyDelay;
                spiralParticle.initDelay    = initDelay;

                if (emitterOrientationStartSync)
                {
                    newParticle.transform.rotation = meTransform.rotation;
                }

                // 초기 방향 설정
                Transform spiralRotateObj = spiralRotate.transform;
                spiralRotateObj.localEulerAngles = new Vector3(Random.Range(initOrientationMin.x, initOrientationMax.x), Random.Range(initOrientationMin.y, initOrientationMax.y), Random.Range(initOrientationMin.z, initOrientationMax.z));

                // 이동
                spiralParticle.initSpeed      = new Vector3(Random.Range(initSpeedMin.x, initSpeedMax.x), Random.Range(initSpeedMin.y, initSpeedMax.y), Random.Range(initSpeedMin.z, initSpeedMax.z));
                spiralParticle.endSpeed       = new Vector3(Random.Range(endSpeedMin.x, endSpeedMax.x), Random.Range(endSpeedMin.y, endSpeedMax.y), Random.Range(endSpeedMin.z, endSpeedMax.z));
                spiralParticle.speedTweenType = (SpiralParticle.Tweens)((int)speedTweenType);

                // 회전
                int randomDir = 1;
                if (randomReverseRotate)
                {
                    if (Random.value > 0.5f)
                    {
                        randomDir = -1;
                    }
                }
                spiralParticle.initRotate      = new Vector3(Random.Range(initRotateMin.x, initRotateMax.x) * randomDir, Random.Range(initRotateMin.y, initRotateMax.y) * randomDir, Random.Range(initRotateMin.z, initRotateMax.z) * randomDir);
                spiralParticle.endRotate       = new Vector3(Random.Range(endRotateMin.x, endRotateMax.x) * randomDir, Random.Range(endRotateMin.y, endRotateMax.y) * randomDir, Random.Range(endRotateMin.z, endRotateMax.z) * randomDir);
                spiralParticle.rotateTweenType = (SpiralParticle.Tweens)((int)rotateTweenType);

                // Distance (반경)
                spiralParticle.distanceBirth     = Random.Range(distanceBirthMinMax.x, distanceBirthMinMax.y);
                spiralParticle.distanceDeath     = Random.Range(distanceDeathMinMax.x, distanceDeathMinMax.y);
                spiralParticle.distanceTweenType = (SpiralParticle.Tweens)((int)distanceTweenType);

                // Trail 처리
                TrailRenderer trailRenderer = newParticle.transform.GetComponentInChildren <TrailRenderer>();
                if (trailRenderer)
                {
                    // Length
                    trailRenderer.time = Random.Range(trailTimeMinMax.x, trailTimeMinMax.y);

                    // Width
                    trailRenderer.startWidth = Random.Range(sizeHeadMinMax.x, sizeHeadMinMax.y);
                    trailRenderer.endWidth   = trailRenderer.startWidth * sizeTailRatio;
                }

                // Ziggle Move
                if (useZiggleMove)
                {
                    SpiralZiggleMove spiralZiggleMove = spiralRotateObj.gameObject.GetComponent <SpiralZiggleMove>();

                    // ZiggleMove 컴포넌트가 없으면 생성
                    if (!spiralZiggleMove)
                    {
                        spiralZiggleMove = spiralRotateObj.gameObject.AddComponent <SpiralZiggleMove>();
                    }

                    spiralZiggleMove.direction = ziggleMoveDirection;
                    spiralZiggleMove.speed     = ziggleMoveSpeed;
                    spiralZiggleMove.radius    = ziggleMoveRadius;
                    spiralZiggleMove.stiffness = ziggleMoveStiffness;
                }
            }
            spawnedCount = totalSpawnCount;
        }
    }