Object Reference to a global private variable is set in Awake function but lost in another function in the same class.
please look at the comments in the code provided for a better understanding of the problem.
Object reference is set in CharacterMovementModel.Awake() and as expected Debug.Log(m_Attributes) prints the gameObject name with the component name.
The Update function in JellyMovementModel, which inherits from CharacterMovementModel() also prints expected results when Debug.Log(m_Attributes) is used.
But when the CharacterMovementModel.UpdateMovement() is called from JellyMovementModel.Update() Debug.Log(m_Attributes) prints "NULL".
I found a "non graceful" work around. Setting the reference to m_Attributes right before it is used in CharacterMovementModel.UpdateMovement(). UpdateMovement() is only ever called from JellyMovementModel.Update() and hence I am not fond of it.
I do not understand how the work around works or how it doesn't work without the work around.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CharacterMovementModel : MonoBehaviour
{
protected float m_speed;
protected Rigidbody2D m_Body;
protected CharacterAttributes m_Attributes;
protected Vector2 m_MovmentDirection;
private Vector2 m_RecievedDirection;
private Vector2 m_FacingDirection;
protected void Awake()
{
m_Attributes = GetComponent<CharacterAttributes>();
m_Body = GetComponent<Rigidbody2D>();
m_speed = m_Attributes.getSpeed();
//this Returns the correct component of the corrent game object.
Debug.Log(m_Attributes);
}
//this function is called from the class which inherits from this class
protected void UpdateDirection()
{
//this Returns NULL
Debug.Log(m_Attributes);
m_MovmentDirection = new Vector2(m_RecievedDirection.x, m_RecievedDirection.y);
if (m_RecievedDirection != Vector2.zero)
{
Vector2 facingDirection = m_MovmentDirection;
if (facingDirection.x != 0 && facingDirection.y != 0)
{
if (facingDirection.x == m_FacingDirection.x)
{
facingDirection.y = 0;
}
else if (facingDirection.y == m_FacingDirection.y)
{
facingDirection.x = 0;
}
else
{
facingDirection.x = 0;
}
}
m_FacingDirection = facingDirection;
}
}
protected void ResetRecievedDirection()
{
m_RecievedDirection = Vector2.zero;
}
private void UpdateHit()
{
}
virtual protected void UpdateMovement()
{
if (PlayerAttributes.instance.IsGameStateFrozen())
{
m_MovmentDirection = Vector2.zero;
}
if (m_MovmentDirection != Vector2.zero)
{
m_MovmentDirection.Normalize();
}
m_Body.velocity = m_MovmentDirection * m_speed;
}
public Vector2 GetFacingDirection()
{
return m_FacingDirection;
}
public bool IsMoving()
{
return m_MovmentDirection != Vector2.zero;
}
public void SetDirection(Vector2 direction)
{
if (direction == Vector2.zero)
{
return;
}
m_RecievedDirection = direction;
}
public virtual void DoAction()
{
}
public void GetHit()
{
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class JellyMovementModel : CharacterMovementModel
{
protected void Update()
{
if (PlayerAttributes.instance.IsGameStateFrozen())
return;
//this Returns the correct component of the corrent game object.
Debug.Log(m_Attributes);
//this is a function from the base class but does not have the reference to m_Attributes
UpdateDirection();
ResetRecievedDirection();
}
protected void FixedUpdate()
{
UpdateMovement();
}
}
Pre thanks :)
Your answer
Follow this Question
Related Questions
Script execution order of child and parent classes - Parent then children??? 1 Answer
Strange behaviour when inheriting parent class with Monobehaviour 1 Answer
How to handle FixedUpdate() and Input 0 Answers
Is it Possible to Create a App for a Minecraft Server using Unity? 2 Answers
Help with Custom Mono Develop Macros 1 Answer