Forum begins after the advertisement:


Search Results for 'fader'

Home Forums Search Search Results for 'fader'

Viewing 12 results - 76 through 87 (of 87 total)
  • Author
    Search Results
  • Terence
    Keymaster

    Anonymes FRACTAL has helped us point out a few bugs on the project files for Part 7 of this series:

    This is better, I can now move my player, but always bugs. Respawn button is broken and i have 3 error in console :
    NullReferenceException: Object reference not set to an instance of an object
    SceneFader.SetColorImage (System.Single& _alpha, SceneFader+FadeDirection _fadeDirection) (at Assets/Scripts/SceneFader.cs:71)
    SceneFader+d__5.MoveNext () (at Assets/Scripts/SceneFader.cs:40)
    UnityEngine.SetupCoroutine.InvokeMoveNext (System.Collections.IEnumerator enumerator, System.IntPtr returnValueAddress) (at :0)
    UnityEngine.MonoBehaviour:StartCoroutine(IEnumerator)
    SceneTransition:Start() (at Assets/Scripts/SceneTransition.cs:26)
    There can be only one active Event System.
    UnityEngine.EventSystems.EventSystem:OnEnable () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:424)
    EndOfStreamException: Unable to read beyond the end of the stream.
    System.IO.BinaryReader.ReadByte () (at :0)
    System.IO.BinaryReader.Read7BitEncodedInt () (at :0)
    System.IO.BinaryReader.ReadString () (at :0)
    SaveData.LoadBench () (at Assets/Scripts/Singletons/SaveData.cs:71)
    GameManager.RespawnPlayer () (at Assets/Scripts/Singletons/GameManager.cs:64)
    UnityEngine.Events.InvokableCall.Invoke () (at :0)
    UnityEngine.Events.UnityEvent.Invoke () (at :0)
    UnityEngine.UI.Button.Press () (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:70)
    UnityEngine.UI.Button.OnPointerClick (UnityEngine.EventSystems.PointerEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/UI/Core/Button.cs:114)
    UnityEngine.EventSystems.ExecuteEvents.Execute (UnityEngine.EventSystems.IPointerClickHandler handler, UnityEngine.EventSystems.BaseEventData eventData) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:57)
    UnityEngine.EventSystems.ExecuteEvents.Execute[T] (UnityEngine.GameObject target, UnityEngine.EventSystems.BaseEventData eventData, UnityEngine.EventSystems.ExecuteEvents+EventFunction`1[T1] functor) (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/ExecuteEvents.cs:272)
    UnityEngine.EventSystems.EventSystem:Update() (at Library/PackageCache/com.unity.ugui@1.0.0/Runtime/EventSystem/EventSystem.cs:501)
    #13197
    Allan Valin
    Participant

    Hey, I’m here again.

    Changing the Enemy script to use Start() instead of Awake() isn’t mentioned on the blog post (after section 2.c).

    Section 2.d on the video tells to change “this” to “gameObject”, but previous code already had that. Health = maxHealth; is moved from Awake() to Start(), but that isn’t shown on the code (it was just removed), and while it’s shown on the video, it’s very fast and not mentioned.

    The 2D DarkCave Assets pack is said to be in the description of the video, but it isn’t. Though it is on the blog post.

    On Section 3, I noticed that my camera settings weren’t the same as shown in the video, values for Position, Projection, and MSAA were different (I think I followed the tutorial pretty closely, so it was either not mentioned or too fast for me to notice the changes). Also, the Offset value on my script was -20 and the Inspector on the video shows -15.

    I don’t think it was mentioned to remove the previous “Floor” objects from testing.

    About wall placement, video and blog say -1, but a card on the video says 1.

    When adding the fog, I can only see the column if the alpha value is under 20, somehow. At the beginning of the video it’s said to make the player a prefab, what about the enemy?

    When adding vegetation, the blog says to use the Multiple mode (and shows a Single image), while the videos doesn’t tell to change that. I tried Multiple and with that you can’t drag and drop the image on the scene, so I assume it was just a copy and paste gone wrong there.

    At 29:22 it’s said to go to Edit > Build Settings, but for me it is File > Build Settings.

    In the blog post, the part about the transition manager doesn’t have a semicolon on “SceneManager.LoadScene(transitionTo)”.

    The public IEnumerator WalkIntoNewScene() has a “<” out of place around line 281 on the Player Controller (blog post). On the blog it shows the line “if (_exitDir.y != 0)” while the video shows “if (_exitDir.y > 0)”.

    The code for PlayerStateList adding “cutscene” isn’t on the blog. Adding “if (pState.cutscene) return;” in Update() and FixedUpdate() isn’t shown as well.

    I think “PlayerController.Instance.pState.cutscene = true;” on the SceneTransition trigger wasn’t mentioned (isn’t on the blog).

    At 34:11 the Exit Time was changed offscreen from 0.25 to 0.5.

    The use of Prefabs for the Scene Transition seems to cause me bugs. Even though I changed the name of the destination, it still uses the value of the prefab instead, e.g. I’d make a prefab of the cave_2 transition, use it on cave_2 and assign it to cave_2, and every time I’d exit cave_2, I’d enter it. At some point I even went to cave_3 when I removed the scene name from the prefab (even though it was still assigned after dragging the prefab to the hierarchy).

    At 35:51 there are multiple steps that aren’t mentioned, and even with the blog description I’m not sure I got it after even watching at 0,25x speed. A script was added, the scene fader was dragged to the prefab… in 10 seconds there are at least 7 steps. The part at 36:11 was clearly an edit problem, it shows a previous state of the Scene Fader object, when it didn’t have a script and was still white and not stretched.

    using UnityEngine.UI; isn’t shown on the code for SceneFader.cs on the blog. fadeOutUIImage has line break where the serialize field should’ve been removed. The code for FadeDirection was skipped and isn’t shown on later codes. [SerializeField] private float fadeTime; isn’t declared. On UIManager.cs, only sceneFader = GetComponentInChildren<SceneFader>(); is declared, without variable or Start() function shown on the blog. The first code block of SceneFader names the class as “UIManager” instead of SceneFader.

    Trying to copy the drag and drop to supposedly update the Prefab I ended up fucking everything up and basically replacing the HP and mana with the scene fader… which made the player prefab lose the reference to mana and I can’t seem to update it correctly.

    When fixing the flashing effect, the variable canFlash isn’t in the code.

    After fixing the flashing effect the player object is shown as lower quality and the camera is zoomed in for whatever reason. It’s like it went to 140p video quality. (restarting the editor fixed it).

    For whatever reason, the heart containerts won’t appear filled up anymore, without me changing anything.

    Starting on part 6 I’ll probably just ask questions if I can’t solve the problems I find.

    Terence
    Keymaster

    Hi Haydn,

    The error should be here:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class SceneTransition : MonoBehaviour
    {
    
        [SerializeField] private string transitionTo;
    
        [SerializeField] private Transform startPoint;
    
        [SerializeField] private Vector2 exitDirection;
    
        [SerializeField] private float exitTime;
    
        private void Start()
        {
            if(transitionTo == GameManager.instance.transitionFromScene)
            {
                PlayerController.instance.transform.position = startPoint.position;
    
                StartCoroutine(PlayerController.instance.WalkIntoNewScnene(exitDirection, exitTime));
            }
            StartCoroutine(UiManager.instance.sceneFader.fade(ScreenFader.fadeDirection.Out));
    
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                GameManager.instance.transitionFromScene = SceneManager.GetActiveScene().name;
    
                PlayerController.instance.pState.transition = true;
    
                StartCoroutine(UiManager.instance.sceneFader.FadeAndLoadScene(ScreenFader.fadeDirection.In, transitionTo));
                Debug.Log(UiManager.instance);
                Debug.Log(UiManager.instance.sceneFader);
            }
        }
    }

    Can you put the lines highlighted in green above and show me the Console output? And show me your Inspector for the UIManager as well.

    Haydn V
    Participant

    there is an error that happens when my player touches the scene transition in makes the player not enter the next scene the error points out the NullReferenceException: Object reference not set to an instance of an object SceneTransition.OnTriggerEnter2D (UnityEngine.Collider2D _other) (at Assets/scripts/SceneTransition.cs:37)

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.SceneManagement;
    
    public class SceneTransition : MonoBehaviour
    {
    
        [SerializeField] private string transitionTo;
    
        [SerializeField] private Transform startPoint;
    
        [SerializeField] private Vector2 exitDirection;
    
        [SerializeField] private float exitTime;
    
        private void Start()
        {
            if(transitionTo == GameManager.instance.transitionFromScene)
            {
                PlayerController.instance.transform.position = startPoint.position;
    
                StartCoroutine(PlayerController.instance.WalkIntoNewScnene(exitDirection, exitTime));
            }
            StartCoroutine(UiManager.instance.sceneFader.fade(ScreenFader.fadeDirection.Out));
    
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                GameManager.instance.transitionFromScene = SceneManager.GetActiveScene().name;
    
                PlayerController.instance.pState.transition = true;
    
                StartCoroutine(UiManager.instance.sceneFader.FadeAndLoadScene(ScreenFader.fadeDirection.In, transitionTo));
    
            }
        }
    }
    #12643
    Niyam Shah
    Participant

    It’s referring to the UI managers scene fader coroutine. I’ve added debuglog.actives and it’s returning false in the respawn function but true if I place it anywhere else

    #12570
    Terence
    Keymaster

    Hi Niyam,

    If a game freezes when you run code, usually its because you have a loop that does not terminate. Try commenting your while loops out in SceneFader and see if the freeze still happens.

        public IEnumerator Fade(FadeDirection _fadeDirection)
        {
    
    
                float _alpha = _fadeDirection == FadeDirection.Out ? 1 : 0;
                float _fadeEndValue = _fadeDirection == FadeDirection.Out ? 0 : 1;
    
                if (_fadeDirection == FadeDirection.Out)
                {
                    while (_alpha >= _fadeEndValue)
                    {
                        SetColorImage(ref _alpha, _fadeDirection);
    
                        yield return null;
                    }
    
                    fadeOutUIImage.enabled = false;
                }
                else
                {
                    fadeOutUIImage.enabled = true;
    
                    while (_alpha <= _fadeEndValue)
                    {
                        SetColorImage(ref _alpha, _fadeDirection);
    
                        yield return null;
                    }
                }
    
        }
    

    If this fixes the issue, look into your while loop’s condition and try to find out what is causing the condition to never be met.

    #12568
    Niyam Shah
    Participant

    not sure why – no compiler or any errors occuring – when i touchs spikes, my game will freeze. ive set debug logs in every stage of the IEnumerator and it seens to not work when the scene fader occurs (it works during scene transitions) ive set a respawner in my game and all script stuff is proper

    reference for my spike script – debug log will print – 1, 2, 3, 4, respawn, takes damage

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Spikes : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                StartCoroutine(RespawnPoint());
                Debug.Log("respawn");
            }
        }
    
        IEnumerator RespawnPoint()
        {
            PlayerController.Instance.pState.cutscene = true;
            Debug.Log("1");
            PlayerController.Instance.pState.invincible = true;
            Debug.Log("2");
            PlayerController.Instance.rb.velocity = Vector2.zero;
            Debug.Log("3");
            Time.timeScale = 0;
            StartCoroutine(UIManager.Instance.sceneFader.Fade(SceneFader.FadeDirection.In));
            Debug.Log("4");
            PlayerController.Instance.TakeDamage(1);
            Debug.Log("Takes damage");
            yield return new WaitForSeconds(1);
            Debug.Log("5");
            PlayerController.Instance.transform.position = GameManager.Instance.platformingRespawnPoint;
            Debug.Log("6");
            StartCoroutine(UIManager.Instance.sceneFader.Fade(SceneFader.FadeDirection.Out));
            Debug.Log("7");
            yield return new WaitForSeconds(UIManager.Instance.sceneFader.fadeTime);
            Debug.Log("8");
            PlayerController.Instance.pState.cutscene = false;
            PlayerController.Instance.pState.invincible = false;
            Debug.Log("9");
            Time.timeScale = 1;
        }
    }
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class SceneFader : MonoBehaviour
    {
        [SerializeField] public float fadeTime;
    
        private Image fadeOutUIImage;
    
        public enum FadeDirection
        {
            In,
            Out
        }
    
        private void Awake()
        {
    
                fadeOutUIImage = GetComponent<Image>();
        }
    
        public IEnumerator Fade(FadeDirection _fadeDirection)
        {
    
    
                float _alpha = _fadeDirection == FadeDirection.Out ? 1 : 0;
                float _fadeEndValue = _fadeDirection == FadeDirection.Out ? 0 : 1;
    
                if (_fadeDirection == FadeDirection.Out)
                {
                    while (_alpha >= _fadeEndValue)
                    {
                        SetColorImage(ref _alpha, _fadeDirection);
    
                        yield return null;
                    }
    
                    fadeOutUIImage.enabled = false;
                }
                else
                {
                    fadeOutUIImage.enabled = true;
    
                    while (_alpha <= _fadeEndValue)
                    {
                        SetColorImage(ref _alpha, _fadeDirection);
    
                        yield return null;
                    }
                }
    
    
    
        }
    
        public IEnumerator FadeAndLoadScene(FadeDirection _fadeDirection, string _sceneToLoad)
        {
            fadeOutUIImage.enabled = true;
    
            yield return Fade(_fadeDirection);
    
            SceneManager.LoadScene(_sceneToLoad);
        }
    
        void SetColorImage(ref float _alpha, FadeDirection _fadeDirection)
        {
    
                fadeOutUIImage.color = new Color(fadeOutUIImage.color.r, fadeOutUIImage.color.g, fadeOutUIImage.color.b, _alpha);
    
                _alpha += Time.deltaTime * (1 / fadeTime) * (_fadeDirection == FadeDirection.Out ? -1 : 1);
    
        }
    }
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class SceneTransition : MonoBehaviour
    {
        [SerializeField] private string transitionTo; //Represents the scene to transition to
    
        [SerializeField] private Transform startPoint; //Defines the player's entry point in the scene
    
        [SerializeField] private Vector2 exitDirection; //Specifies the direction for the player's exit
    
        [SerializeField] private float exitTime; //Determines the time it takes for the player to exit the scene transition
    
    
    
        // Start is called before the first frame update
        private void Start()
    
        {
            if (GameManager.Instance.transitionedFromScene == transitionTo)
            {
                PlayerController.Instance.transform.position = startPoint.position;
    
                StartCoroutine(PlayerController.Instance.WalkIntoNewScene(exitDirection, exitTime));
            }
    
            StartCoroutine(UIManager.Instance.sceneFader.Fade(SceneFader.FadeDirection.Out));
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                GameManager.Instance.transitionedFromScene = SceneManager.GetActiveScene().name;
    
                SceneManager.LoadScene(transitionTo);
    
                PlayerController.Instance.pState.cutscene = true;
    
                StartCoroutine(UIManager.Instance.sceneFader.FadeAndLoadScene(SceneFader.FadeDirection.In, transitionTo));
    
            }
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class GameManager : MonoBehaviour
    {
        public string transitionedFromScene;
    
        public Vector2 platformingRespawnPoint;
    
        public static GameManager Instance { get; private set; }
        private void Awake()
        {
            if(Instance != null && Instance != this)
            {
                Destroy(gameObject);
            }
            else
            {
                Instance = this;
            }
            DontDestroyOnLoad(gameObject);
        }
    
    }
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class PlatformRespawnPoint : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
    
        }
    
        // Update is called once per frame
        void Update()
        {
    
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                GameManager.Instance.platformingRespawnPoint = transform.position;
            }
        }
    }
    #12536
    Niyam Shah
    Participant

    i tried using a debug log and it works but im still getting these errors at random places:

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class SceneTransition : MonoBehaviour
    {
        [SerializeField] private string transitionTo; //Represents the scene to transition to
    
        [SerializeField] private Transform startPoint; //Defines the player's entry point in the scene
    
        [SerializeField] private Vector2 exitDirection; //Specifies the direction for the player's exit
    
        [SerializeField] private float exitTime; //Determines the time it takes for the player to exit the scene transition
    
        // Start is called before the first frame update
        private void Start()
    
        {
            if (GameManager.Instance.transitionedFromScene == transitionTo)
            {
                PlayerController.Instance.transform.position = startPoint.position;
    
                StartCoroutine(PlayerController.Instance.WalkIntoNewScene(exitDirection, exitTime));
            }
    
            StartCoroutine(UIManager.Instance.sceneFader.Fade(SceneFader.FadeDirection.Out));
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                GameManager.Instance.transitionedFromScene = SceneManager.GetActiveScene().name;
    
                SceneManager.LoadScene(transitionTo);
    
                PlayerController.Instance.pState.cutscene = true;
    
                StartCoroutine(UIManager.Instance.sceneFader.FadeAndLoadScene(SceneFader.FadeDirection.In, transitionTo));
    
                Debug.Log("scene fader works");
            }
        }
    }
    using System.Collections;
    using System.Collections.Generic;
    using Unity.VisualScripting;
    using UnityEngine;
    using UnityEngine.UI;
    
    public class PlayerController : MonoBehaviour
    {
        [Header("Horizontal Movement Settings")]
        [SerializeField] private float walkSpeed = 1;
        [Space(5)]
    
        [Header("Dash Settings")]
        [SerializeField] private float dashSpeed;
        [SerializeField] private float dashTime;
        [SerializeField] private float dashCooldown;
        [SerializeField] GameObject dashEffect;
        private bool canDash = true;
        private bool dashed;
        [Space(5)]
    
        [Header("Vertical Movement Settings")]
        [SerializeField] private float jumpForce = 45;
        private int jumpBufferCounter = 0;
        [SerializeField] private int jumpBufferFrames;
        private float coyoteTimeCounter = 0;
        [SerializeField] private float coyoteTime;
        [SerializeField] private float airJumpsCounter = 0;
        [SerializeField] private int maxAirJumps;
        [Space(5)]
    
        [Header("recoil")]
        [SerializeField] int recoilXSteps = 5;
        [SerializeField] int recoilYSteps = 5;
        [SerializeField] float recoilXSpeed = 100; 
        [SerializeField] float recoilYSpeed = 100;
        private int stepsXRecoiled, stepsYRecoiled;
        [Space(5)]
    
        [Header("Attack Settings")]
        private bool attack = false;
        private float timeBetweenAttack, timeSinceAttack;
        [SerializeField] Transform SideAttackTransform, BehindAttackTransform, UpAttackTransform, DownAttackTransform;
        [SerializeField] Vector2 SideAttackArea, BehindAttackArea, UpAttackArea, DownAttackArea;
        [SerializeField] LayerMask attackableLayer;
        [SerializeField] float damage;
        [SerializeField] GameObject slashEffect;
        [SerializeField] GameObject upSlashEffect;
        [SerializeField] GameObject downSlashEffect;
        bool restoreTime;
        float restoreTimeSpeed;
        [Space(5)]
    
        [Header("Ground Check Settings")]
        [SerializeField] private Transform groundCheckPoint;
        [SerializeField] private float groundCheckY = 0.2f;
        [SerializeField] private float groundCheckX = 0.5f;
        [SerializeField] private LayerMask whatIsGround;
        [Space(5)]
    
        [Header("Health")]
        public int health;
        public int maxHealth;
        [SerializeField] GameObject bloodSpurt;
        [SerializeField] GameObject crackeffect;
        [SerializeField] float hitFlashSpeed;
        public delegate void OnHealthChangedDelegate(); // delegate voids can be used on multiple methods
        [HideInInspector] public OnHealthChangedDelegate onHealthChangedCallBack;
        float healTimer;
        [SerializeField] float timeToHeal;
        [Space(5)]
    
        [Header("Mana settings")]
        [SerializeField] UnityEngine.UI.Image manaStorage;
        [SerializeField] float mana;
        [SerializeField] float manaDrainSpeed;
        [SerializeField] float manaGain;
        [Space(5)]
    
        [Header("Spell Settings")]
        //spell stats
        [SerializeField] float manaSpellCost;
        [SerializeField] float timeBetweenCast = 0.5f;
        float timeSinceCast;
        [SerializeField] float spellDamage; 
        //spell cast objects
        [SerializeField] GameObject upSpellExplosion;
        [Space(5)]
    
        [HideInInspector] public playerStatesList pState;
    
        private float xAxis, yAxis;
        private Rigidbody2D rb;
        private float gravity;
        private Animator anim;
        private SpriteRenderer sr;
    
    
    
        public static PlayerController Instance;
    
        private void Awake()
        {
            if(Instance != null && Instance != this)
            {
                Destroy(gameObject);
            }
            else
            {
                Instance = this;
            }
    
            DontDestroyOnLoad(gameObject);
        }
    
    
    
        // Start is called before the first frame update
        void Start()
        {
            pState = GetComponent<playerStatesList>();
    
            rb = GetComponent<Rigidbody2D>();
    
            anim = GetComponent<Animator>();
    
            sr = GetComponent<SpriteRenderer>();
    
            gravity = rb.gravityScale;
    
            Mana = mana;
    
            manaStorage.fillAmount = Mana;
    
            Health = maxHealth;
    
        }
    
    
    
        //draw out hitboxes for basic attacks
        private void OnDrawGizmos()
        {
            Gizmos.color = Color.red;
            Gizmos.DrawWireCube(SideAttackTransform.position, SideAttackArea);
            Gizmos.DrawWireCube(BehindAttackTransform.position, BehindAttackArea);
            Gizmos.DrawWireCube(UpAttackTransform.position, UpAttackArea);
            Gizmos.DrawWireCube(DownAttackTransform.position, DownAttackArea);
        }
    
    
    
        // Update is called once per frame
        void Update()
        {
            if (pState.cutscene) return;
    
            GetInputs();
            updateJumpVariable();
            RestoreTimeScale();
    
            if (pState.dashing) return;
            Flip();
            Move();
            Jump();
            StartDash();
            Attack();
            FlashWhileInvincible();
            Heal();
            CastSpell();
        }
        private void OnTriggerEnter2D(Collider2D _other) //for up and down cast spell
        {
            if (_other.GetComponent<Enemy>() != null && pState.casting)
            {
                _other.GetComponent<Enemy>().EnemyHit(spellDamage, (_other.transform.position - transform.position).normalized, -recoilYSpeed);
            }
        }
        private void FixedUpdate()
        {
            if (pState.cutscene) return;
    
            if (pState.dashing) return;
            Recoil();
        }
    
        //basic inputs for movement
        void GetInputs()
        {
            xAxis = Input.GetAxisRaw("Horizontal");
            yAxis = Input.GetAxisRaw("Vertical");
            attack = Input.GetButtonDown("Attack");
        }
    
    
    
        // flip player on x axis when left or right is picked
        void Flip()
        {
            if(xAxis < 0)
            {
                transform.localScale = new Vector2(-1, transform.localScale.y);
                pState.lookingRight = false;
            }
    
            else if(xAxis > 0)
            {
                transform.localScale = new Vector2(1, transform.localScale.y);
                pState.lookingRight = true;
            }
    
    
        }
    
    
    
        //move left and right
        private void Move()
        {
            rb.velocity = new Vector2(walkSpeed * xAxis, rb.velocity.y);
            anim.SetBool("walking", rb.velocity.x != 0 && Grounded());
        }
    
    
    
        //allows for dashing and air dashing
        void StartDash()
        {
            if(Input.GetButtonDown("Dash") && canDash && !dashed)
            {
                StartCoroutine(Dash());
                dashed = true;
            }
    
            if (Grounded())
            {
                dashed = false;
            }
        }
        //stops middair infinite dashing
        IEnumerator Dash()
        {
            canDash = false;
    
            pState.dashing = true;
    
            anim.SetTrigger("Dashing");
    
            rb.gravityScale = 0;
    
            int _dir = pState.lookingRight ? 1 : -1;
    
            rb.velocity = new Vector2(_dir * dashSpeed, 0);
            if (Grounded()) Instantiate(dashEffect, transform);
    
            yield return new WaitForSeconds(dashTime);
    
            rb.gravityScale = gravity;
    
            pState.dashing = false;
    
            yield return new WaitForSeconds(dashCooldown);
    
            canDash = true;
        }
    
    
        public IEnumerator WalkIntoNewScene(Vector2 _exitDir, float _delay)
        {
            //if you exit upwards
            if(_exitDir.y > 0)
            {
                rb.velocity = jumpForce * _exitDir;
            }
    
            //horizontal exiting
            if(_exitDir.x != 0)
            {
                xAxis = _exitDir.x > 0 ? 1 : -1;
    
                Move();
            }
    
            Flip();
            yield return new WaitForSeconds(_delay);
            pState.cutscene = false;
        }
    
    
        //create hitboxes for attacks
        void Attack()
        {
            timeSinceAttack += Time.deltaTime;
            if(attack && timeSinceAttack >= timeBetweenAttack)
            {
    
                timeSinceAttack = 0;
    
    
                //side attack
                if (yAxis == 0 || yAxis < 0 && Grounded())
                {
                    Hit(SideAttackTransform, SideAttackArea, ref pState.recoilingx, recoilXSpeed);
                    Instantiate(slashEffect, SideAttackTransform);
                    anim.SetTrigger("Attacking");
    
                }
    
                //up air attack
                else if (yAxis > 0 && !Grounded())
                {
                    Hit(UpAttackTransform, UpAttackArea, ref pState.recoilingy, recoilYSpeed);
                    Instantiate(upSlashEffect, UpAttackTransform);
                    anim.SetTrigger("Attacking");
                }
    
                //down air attak
                else if (yAxis < 0 && !Grounded())
                {
                    Hit(DownAttackTransform, DownAttackArea, ref pState.recoilingy, recoilYSpeed);
                    Instantiate(downSlashEffect, DownAttackTransform);
                    anim.SetTrigger("Attacking");
                }
    
                if (yAxis > 0 && Grounded())
                {
                    Hit(UpAttackTransform, UpAttackArea, ref pState.recoilingy, recoilYSpeed);
                    Instantiate(upSlashEffect, UpAttackTransform);
                    anim.SetTrigger("upAttack");
                }
            }
    
        }
    
    
    
        //hitting the enemy and adding recoil to attacks
        void Hit(Transform _attackTransform, Vector2 _attackArea, ref bool _recoilDir, float _recoilStrength)
        {
            Collider2D[] objectsToHit = Physics2D.OverlapBoxAll(_attackTransform.position, _attackArea, 0, attackableLayer);
    
            if(objectsToHit.Length > 0)
            {
                _recoilDir = true;  
            }
    
            for(int i = 0; i < objectsToHit.Length; i++)
            {
                if (objectsToHit[i].GetComponent<Enemy>() != null)
                {
                    objectsToHit[i].GetComponent<Enemy>().EnemyHit
                        (damage, (transform.position - objectsToHit[i].transform.position).normalized, _recoilStrength);
    
                    if (objectsToHit[i].CompareTag("Enemy"))
                    {
                        Mana += manaGain;
                    }
                }
            }
        }
    
    
    
        //changes the direction of attack based on aerial positions
        void SlashEffectAtAngle(GameObject _slashEffect, int _effectAngle, Transform _attackTransform)
        {
            _slashEffect = Instantiate(_slashEffect, _attackTransform);
            _slashEffect.transform.eulerAngles = new Vector3(0, 0, _effectAngle);
            _slashEffect.transform.localScale = new Vector2(transform.localScale.x, transform.localScale.y);
        }
    
        void UpSlashEffectAtAngle(GameObject _upSlashEffect, int _effectAngle, Transform _attackTransform)
        {
            _upSlashEffect = Instantiate(_upSlashEffect, _attackTransform);
            _upSlashEffect.transform.eulerAngles = new Vector3(0, 0, _effectAngle);
            _upSlashEffect.transform.localScale = new Vector2(transform.localScale.x, transform.localScale.y);
        }
    
        void DownSlashEffectAtAngle(GameObject _downSlashEffect, int _effectAngle, Transform _attackTransform)
        {
            _downSlashEffect = Instantiate(_downSlashEffect, _attackTransform);
            _downSlashEffect.transform.eulerAngles = new Vector3(0, 0, _effectAngle);
            _downSlashEffect.transform.localScale = new Vector2(transform.localScale.x, transform.localScale.y);
        }
    
    
    
        //directional player recoil based on main slash attacks, x and y axis movement
        void Recoil()
        {
            //recoiling in the x axis
            if (pState.recoilingx)
            {
                if (pState.lookingRight)
                {
                    rb.velocity = new Vector2(-recoilXSpeed, 0);
                }
                else
                {
                    rb.velocity = new Vector2(recoilXSpeed, 0);
                }
            }
    
            //recoil in the y axis
            if (pState.recoilingy)
            {
                rb.gravityScale = 0;
                if (yAxis < 0)
                {
                    rb.velocity = new Vector2(rb.velocity.x, recoilYSpeed);
                }
                else
                {
                    rb.velocity = new Vector2(rb.velocity.x, -recoilYSpeed);
                }
                airJumpsCounter = 0;
            }
            else
            {
                rb.gravityScale = gravity;
            }
    
            //stop recoiling
    
            if (pState.recoilingx && stepsXRecoiled < recoilXSteps)
            {
                stepsXRecoiled++;
            }
    
            else
            {
                StopRecoilX();
            }
    
            if (pState.recoilingy && stepsYRecoiled < recoilYSteps)
            {
                stepsYRecoiled++;
            }
    
            else
            {
                StopRecoilY();
            }
    
            if (Grounded())
            {
                StopRecoilY();
            }
        }
    
    
        //stop recoiling forever
        void StopRecoilX()
        {
            stepsXRecoiled = 0;
            pState.recoilingx = false;
        }
        void StopRecoilY()
        {
            stepsYRecoiled = 0;
            pState.recoilingy = false;
        }
    
    
    
        //take damage, set health and gives some invinicibility frames
        public void TakeDamage(float _damage)
        {
            Health -= Mathf.RoundToInt(_damage);
            StartCoroutine(StopTakingDamage());
        }
    
        IEnumerator StopTakingDamage()
        {
            pState.invincible = true;
            anim.SetTrigger("takeDamage");
            GameObject _bloodSpurtParticles = Instantiate(bloodSpurt, transform.position, Quaternion.identity);
            GameObject _crack = Instantiate(crackeffect, transform.position, Quaternion.identity);
            Destroy(_crack, 0.1f);
            Destroy(_bloodSpurtParticles, 1.5f);
            yield return new WaitForSeconds(1f);
            pState.invincible = false;
        }
    
        //flash black and white when hit for i frames
        void FlashWhileInvincible()
        {
            sr.material.color = pState.invincible ?
                Color.Lerp(Color.white, Color.black, Mathf.PingPong(Time.time * hitFlashSpeed, 1.5f)) : Color.white;
        }
    
        void RestoreTimeScale()
        {
            if (restoreTime)
            {
                if (Time.timeScale < 1)
                {
                    Time.timeScale += Time.deltaTime * restoreTimeSpeed;
                }
                else
                {
                    Time.timeScale = 1;
                    restoreTime = false;
                }
            }
        }
    
    
        //create invincibility frames
        public void HitStopTime(float _newTimeScale, int _restoreSpeed, float _delay)
        {
            restoreTimeSpeed = _restoreSpeed;
            Time.timeScale = _newTimeScale;
    
            if (_delay > 0)
            {
                StopCoroutine(StartTimeAgain(_delay));
                StartCoroutine(StartTimeAgain(_delay));
            }
            else
            {
                restoreTime = true;
            }
        }
    
    
        //begin taking damage again
        IEnumerator StartTimeAgain(float _delay)
        {
            restoreTime = true;
            yield return new WaitForSeconds(_delay);
        }
    
    
        //health and removing health
        public int Health
        {
            get { return health; }
            set
            {
                if (health != value)
                {
                    health = Mathf.Clamp(value, 0, maxHealth);
    
    
                    if (onHealthChangedCallBack != null)
                    {
                        onHealthChangedCallBack.Invoke();
                    }
                }
            }
        }
    
    
    
        //heal with mana with a
        void Heal()
        {
            if (Input.GetButton("Heal") && Health < maxHealth && Mana > 0 && !pState.jumping && !pState.dashing)
            {
                pState.healing = true;
                anim.SetBool("Healing", true);
    
                //healing
                healTimer += Time.deltaTime;
                if (healTimer >= timeToHeal)
                {
                    Health++;
                    healTimer = 0;
                }
    
                //drain mana
                Mana -= Time.deltaTime * manaDrainSpeed;
            }
            else
            {
                pState.healing = false;
                anim.SetBool("Healing", false);
                healTimer = 0;
            }
        }
    
        //create mana
        float Mana
        {
            get { return mana; }
            set
            {
                //if mana stats change
                if (mana != value)
                {
                    mana = Mathf.Clamp(value, 0, 1);
                    manaStorage.fillAmount = Mana;
                }
            }
        }
    
    
    
        //cast up spell explosion when u have enough mana and its been a long time since your last kaboom
        void CastSpell()
        {
    
            if (Input.GetButtonDown("CastSpell") && timeSinceCast >= timeBetweenCast && Mana >= manaSpellCost && yAxis > 0)
            {
                pState.casting = true;
                timeSinceCast = 0;
                StartCoroutine(CastCoroutine());
            }
            else
            {
                timeSinceCast += Time.deltaTime;
            }
        }
        IEnumerator CastCoroutine()
        {
            anim.SetBool("Casting", true);
            yield return new WaitForSeconds(0.2f);
            //up cast
            if (yAxis > 0)
            {
                Instantiate(upSpellExplosion, transform);
                rb.velocity = Vector2.zero;
            }
    
            Mana -= manaSpellCost;
            yield return new WaitForSeconds(0.2f);
            anim.SetBool("Casting", false);
            pState.casting = false;
        }
    
    
        //checks if you are grounded
        public bool Grounded()
        {
            if(Physics2D.Raycast(groundCheckPoint.position, Vector2.down, groundCheckY, whatIsGround) 
                || Physics2D.Raycast(groundCheckPoint.position + new Vector3(groundCheckX, 0, 0), Vector2.down, groundCheckY, whatIsGround)
                ||Physics2D.Raycast(groundCheckPoint.position + new Vector3(-groundCheckX, 0, 0), Vector2.down, groundCheckY, whatIsGround))
            {
                return true;
            }
            else
            {
                return false;   
            }
        }
    
    
    
        //makes you jump when pressing spacebar
        void Jump()
        {
    
            if (jumpBufferCounter > 0 && coyoteTimeCounter > 0 && !pState.jumping)
            {
                rb.velocity = new Vector3(rb.velocity.x, jumpForce);
    
                pState.jumping = true;
            }
    
            if (!Grounded() && airJumpsCounter < maxAirJumps && Input.GetButtonDown("Jump"))
            {
                pState.jumping = true;
    
                airJumpsCounter++;
    
                rb.velocity = new Vector3(rb.velocity.x, jumpForce);
    
            }
    
            if (Input.GetButtonUp("Jump") && rb.velocity.y > 3)
            {
                rb.velocity = new Vector2(rb.velocity.x, 0);
    
                pState.jumping = false;
            }
    
            //animate jumping double jump and falling animation
    
            anim.SetBool("jumping", !Grounded() && rb.velocity.y > -15 && airJumpsCounter == 0);
    
            anim.SetBool("doublejump", !Grounded() && airJumpsCounter == 1);
    
    
            anim.SetBool("falling", !Grounded() && rb.velocity.y < -10);
    
        }
    
    
    
        //coyote time and jump buffering
        void updateJumpVariable()
        {
            //coyote time
            if (Grounded())
            {
                pState.jumping = false;
                coyoteTimeCounter = coyoteTime;
                airJumpsCounter = 0;
            }
            else
            {
                coyoteTimeCounter -= Time.deltaTime;
            }
    
    
            //jump buffering
            if (Input.GetButtonDown("Jump"))
            {
                jumpBufferCounter = jumpBufferFrames;
            }
            else
            {
                jumpBufferCounter--;
            }
        }
    }
    #12531
    Terence
    Keymaster

    For your scene transition, it seems like this is the line that is the problem:

    StartCoroutine(UIManager.Instance.sceneFader.FadeAndLoadScene(SceneFader.FadeDirection.In, transitionTo));

    You can do a debug log of UIManager.Instance and UIManager.Instance.sceneFader to see which is null.

    For your mana issue, check your character’s mana stat on the Inspector when playing. Does it decrease? If it does, then it means the mana stat is not properly linked to the UI on the new scene.

    #12528
    Niyam Shah
    Participant

    just so you know those errors i showed for my scene transition script arent happening anymore – still have a broken mana meter though

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.SceneManagement;
    
    public class SceneTransition : MonoBehaviour
    {
        [SerializeField] private string transitionTo; //Represents the scene to transition to
    
        [SerializeField] private Transform startPoint; //Defines the player's entry point in the scene
    
        [SerializeField] private Vector2 exitDirection; //Specifies the direction for the player's exit
    
        [SerializeField] private float exitTime; //Determines the time it takes for the player to exit the scene transition
    
        // Start is called before the first frame update
        private void Start()
        {
            if (GameManager.Instance.transitionedFromScene == transitionTo)
            {
                PlayerController.Instance.transform.position = startPoint.position;
    
                StartCoroutine(PlayerController.Instance.WalkIntoNewScene(exitDirection, exitTime));
            }
            StartCoroutine(UIManager.Instance.sceneFader.Fade(SceneFader.FadeDirection.Out));
        }
    
        private void OnTriggerEnter2D(Collider2D _other)
        {
            if (_other.CompareTag("Player"))
            {
                GameManager.Instance.transitionedFromScene = SceneManager.GetActiveScene().name;
    
                SceneManager.LoadScene(transitionTo);
    
                PlayerController.Instance.pState.cutscene = true;
    
                StartCoroutine(UIManager.Instance.sceneFader.FadeAndLoadScene(SceneFader.FadeDirection.In, transitionTo));
            }
        }
    }
    #11930
    Paul Forkus
    Participant

    Im having a null exception error on the scene faders, yet my prefab of scene fader is active. The console is pointing me towards this line: fadeOutUIImage.color = new Color(fadeOutUIImage.color.r, fadeOutUIImage.color.g, fadeOutUIImage.color.b, _alpha); However, i put a debug line in the update function and its showing that fadeOutUIImage is not null, but when i put one in the SetColorImage function, it returned null. Could it be a script execution issue, or could there be something in the inspector I’m overlooking?

    Kiefer Neo
    Moderator

    If you are experiencing a null reference exception on your scene fader, this is probably due to the Scene Fader prefab’s active state being set to false.

    To fix this simply set the Scene Fader prefab to active and the Null Reference Exception should be fixed.

Viewing 12 results - 76 through 87 (of 87 total)

Advertisement below: