예제 #1
0
    public void Fill()
    {
        if (!IsInstance)
        {
            return;
        }

        Layers = new GameObject[Sky.Layers.Count];
        int   indexOffset  = 0;
        bool  isOuterSpace = Name == "OUTERSPACE";
        float offsetScale  = FezHelper.IsSkyClouded(Name) ? 2f : 1f;

        for (int i = 0; i < Layers.Length; i++)
        {
            SkyLayer layer = Sky.Layers[i];

            if (!isOuterSpace && layer.Name.StartsWith("OUTERSPACE"))
            {
                // TODO handle space layer separately
                //indexOffset++;
                //continue;
            }

            GameObject layerObj = layer.GenObject(this, Layers.Length - (i - indexOffset), offsetScale);
            layerObj.transform.parent = transform;
            Layers[i] = layerObj;
        }

        if (!skyInstantiated)
        {
            skyInstantiated       = true;
            RenderSettings.skybox = Instantiate(RenderSettings.skybox);
        }
    }
    public void Update()
    {
        Vector3 ssPositionOld = Camera.main.WorldToScreenPoint(transform.position);

        if (CurrentAction == NpcAction.Idle ||
            CurrentAction == NpcAction.Idle3 ||
            CurrentAction == NpcAction.Walk)
        {
            TimeSinceActionChange += Time.deltaTime;
            if (TimeUntilActionChange <= TimeSinceActionChange)
            {
                ToggleAction();
            }
        }
        else if (!CurrentTiming.Loop && CurrentTiming.Ended && CurrentAction != NpcAction.Hide)
        {
            ToggleAction();
        }

        if (CurrentAction != NpcAction.Talk)
        {
            if (CanTalk && (NPC.Speech.Count > 0 || NPC.CustomSpeechLine != null))
            {
                Talk();
            }
            if (CurrentAction == NpcAction.Walk)
            {
                Walk();
            }
        }
        else if (StopTalking() && CurrentAction != NpcAction.TakeOff)
        {
            ToggleAction();
        }

        Vector3 ssPosition = Camera.main.WorldToScreenPoint(transform.position);
        bool    lookingRight;

        if (FezHelper.AlmostEqual(ssPositionOld.x, ssPosition.x))
        {
            lookingRight = LookingRight;
        }
        else
        {
            lookingRight = ssPositionOld.x < ssPosition.x;
        }
        if (lookingRight)
        {
            transform.LookAt(transform.position + (transform.position - Camera.main.transform.position));
        }
        else
        {
            transform.LookAt(Camera.main.transform.position);
        }
    }
예제 #3
0
    public void Fill(Sky sky)
    {
        Sky          = sky;
        IsFullbright = FezHelper.IsSkyFullbright(Name);

        Texture   = FezManager.Instance.GetTexture("skies/" + sky.Name + "/" + sky.Background) as Texture2D;
        FogColors = Texture.GetPixels(0, (int)(Texture.height / 2f), Texture.width, 1);

        //Horizontal repeat, vertical clamp
        Texture2D fix = new Texture2D(Texture.width, Texture.height + 2, Texture.format, false);

        fix.SetPixels(0, 0, Texture.width, 1, Texture.GetPixels(0, 0, Texture.width, 1));                               // Upper clamp
        fix.SetPixels(0, 1, Texture.width, Texture.height, Texture.GetPixels(0, 0, Texture.width, Texture.height));     // Main gradient
        fix.SetPixels(0, fix.height - 1, Texture.width, 1, Texture.GetPixels(0, Texture.height - 1, Texture.width, 1)); // Lower clamp
        fix.Apply(false, false);
        DestroyImmediate(Texture);
        Texture = fix;

        Texture.wrapMode = TextureWrapMode.Repeat;

        Fill();
    }
예제 #4
0
    public void Update()
    {
        Vector3 ssPositionOld = Camera.main.WorldToScreenPoint(transform.position);

        if (CurrentAction == NpcAction.Idle ||
            CurrentAction == NpcAction.Idle3 ||
            CurrentAction == NpcAction.Walk)
        {
            TimeSinceActionChange += Time.deltaTime;
            if (TimeUntilActionChange <= TimeSinceActionChange)
            {
                ToggleAction();
            }
        }
        else if (!CurrentTiming.Loop && CurrentTiming.Ended && CurrentAction != NpcAction.Hide)
        {
            ToggleAction();
        }

        bool shouldStopTalking = ShouldStopTalking != null && ShouldStopTalking(this);

        if (shouldStopTalking)
        {
            CurrentTextLine = -1;
        }

        if (CurrentAction != NpcAction.Talk)
        {
            if (ShouldStartTalking != null && CanTalk && (NPC.Speech.Count > 0 || NPC.CustomSpeechLine != null) && CurrentTextLine == -1 && ShouldStartTalking(this))
            {
                CurrentAction = NpcAction.Talk;
                UpdateText(0);
            }
            if (CurrentAction == NpcAction.Walk)
            {
                Walk();
            }
        }
        else if ((shouldStopTalking || CurrentTextLine < 0 || CurrentTextLine >= NPC.Speech.Count) && CurrentAction != NpcAction.TakeOff)
        {
            StartCoroutine(FadeTextOut());
            ToggleAction();
        }
        else
        {
            Talking(this);
        }

        transform.LookAt(transform.position + (transform.position - Camera.main.transform.position));
        Vector3 ssPosition = Camera.main.WorldToScreenPoint(transform.position);
        bool    lookingRight;

        if (FezHelper.AlmostEqual(ssPositionOld.x, ssPosition.x))
        {
            lookingRight = LookingRight;
        }
        else
        {
            lookingRight = ssPositionOld.x < ssPosition.x;
        }
        if ((!lookingRight && 0f < meshRenderer.sharedMaterial.mainTextureScale.x) ||
            (lookingRight && meshRenderer.sharedMaterial.mainTextureScale.x < 0f))
        {
            CurrentAnimation.FlipH = !lookingRight;
        }
    }
예제 #5
0
    public void Fill(FezUnitySky sky, SkyLayer layer, int index)
    {
        Layer = layer;

        float skyScale = 1f;

        if (sky.Name == "ROOTS" ||
            sky.Name == "ORR_SKY")
        {
            skyScale = 2f;
        }
        if (sky.Name == "SEWERS")
        {
            skyScale = 32f;
        }

        Material materialBase = FezManager.Instance.SkyLayerMaterial;

        if (sky.IsFullbright)
        {
            // Full-bright sky (no fog, lighting) looks better
            materialBase = FezManager.Instance.SkyLayerFullbrightMaterial;
        }

        MeshFilter meshFilter = gameObject.AddComponent <MeshFilter>();

        meshFilter.sharedMesh = FezManager.Instance.SkyLayerMesh;

        MeshRenderer meshRenderer = gameObject.AddComponent <MeshRenderer>();
        Texture2D    tex          = FezManager.Instance.GetTexture2D("skies/" + sky.Name + "/" + layer.Name);

        meshRenderer.sharedMaterial = Instantiate(tex.GenMaterial(materialBase));

        transform.localScale = new Vector3(
            transform.localScale.x,
            transform.localScale.y * Scale,
            transform.localScale.z
            );
        float ratio = tex.width / tex.height;

        meshRenderer.sharedMaterial.mainTextureScale = new Vector2(1f * skyScale, Scale * ratio * skyScale);
        meshRenderer.sharedMaterial.color            = new Color(1f, 1f, 1f, layer.Opacity);

        // TODO add further special cases
        if (FezHelper.IsSkyExtending(sky.Name))
        {
            // The ceiling / bottom should extend, not repeat
            meshRenderer.sharedMaterial.mainTexture.wrapMode = TextureWrapMode.Clamp;
            meshRenderer.sharedMaterial.mainTextureOffset    = new Vector2(0f, -meshRenderer.sharedMaterial.mainTextureScale.y / 2f + 1f);
        }
        else
        {
            // The sky layer repeats into infinity
            meshRenderer.sharedMaterial.mainTexture.wrapMode = TextureWrapMode.Repeat;
        }

        if (sky.Name == "OUTERSPACE")
        {
            // Scale the repeating star texture properly
            meshRenderer.sharedMaterial.mainTextureScale = new Vector2(
                (index / 4f) * 24f * meshRenderer.sharedMaterial.mainTextureScale.x,
                (index / 4f) * 24f * meshRenderer.sharedMaterial.mainTextureScale.y
                );
        }

        if (sky.Name == "GRAVE")
        {
            // Offset the various layers to add variance in FPV
            transform.localPosition = new Vector3(
                transform.localPosition.x,
                transform.localPosition.y + index * 8f * Scale,
                transform.localPosition.z
                );
        }

        // Fix shadow artifacting
        meshRenderer.shadowCastingMode = ShadowCastingMode.Off;

        // Fix sky flip and offset
        meshRenderer.sharedMaterial.mainTextureOffset = new Vector2(
            meshRenderer.sharedMaterial.mainTextureOffset.x,
            meshRenderer.sharedMaterial.mainTextureScale.y + meshRenderer.sharedMaterial.mainTextureOffset.y - 1f +
            (sky.Name == "ABOVE" ? -0.0125f : 0.625f)
            );
        meshRenderer.sharedMaterial.mainTextureScale = new Vector2(
            meshRenderer.sharedMaterial.mainTextureScale.x,
            -meshRenderer.sharedMaterial.mainTextureScale.y
            );
    }