MovementController.cs 6.91 KB
Newer Older
mthiele2's avatar
mthiele2 committed
1
using System.Collections;
2 3 4
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
5
using _Game.Scripts.Scriptable_Object;
6

7
[RequireComponent(typeof(Rigidbody2D), typeof(CapsuleCollider2D))]
Unknown's avatar
Unknown committed
8 9
public class MovementController : MonoBehaviour
{
Unknown's avatar
Unknown committed
10 11
	[SerializeField] private PlayerState r_State;

12
	[Header("Movement")] [SerializeField] private float m_Speed = 10f;
Unknown's avatar
Unknown committed
13
	[SerializeField] private float m_JumpForce = 400f; // Amount of force added when the player jumps.
Unknown's avatar
Unknown committed
14 15
	[SerializeField] private float m_fallMultiplier = 2.5f;
	[SerializeField] private float m_lowJumpMultiplier = 2.0f;
Unknown's avatar
Unknown committed
16
	[Range(0, .3f)] [SerializeField] private float m_MovementSmoothing = .05f; // How much to smooth out the movement
Unknown's avatar
Unknown committed
17
	[SerializeField] private bool m_AirControl = false; // Whether or not a player can steer while jumping;
18 19
	[SerializeField] private bool m_CanSwim = true;

20 21
	[Header("Ground Check Control")]
	[SerializeField] private LayerMask m_WhatIsGround; // A mask determining what is ground to the character
Unknown's avatar
Unknown committed
22
	[SerializeField] private Transform m_GroundCheck; // A position marking where to check if the player is grounded.
Unknown's avatar
Unknown committed
23
	[SerializeField] private float m_GroundCheckDistance = 1.5f;
24 25
	[SerializeField] private float m_GroundedRadius = .2f;
	[SerializeField] private Vector2 m_GroundedOffset = Vector2.zero;
Unknown's avatar
Merge  
Unknown committed
26
	[SerializeField] private float m_SecondsWaitToJump = 0.3f;
Unknown's avatar
Unknown committed
27
	[SerializeField] private int m_MaxJumpCount = 1;
Unknown's avatar
Unknown committed
28

Unknown's avatar
Unknown committed
29 30 31
	private bool m_Grounded = false; // Whether or not the player is grounded.
	private bool m_Swimming = false;
	private bool m_Airborn = true;
32
	private Rigidbody2D m_Rigidbody2D;
Unknown's avatar
Unknown committed
33
	private bool m_FacingRight = true; // For determining which way the player is currently facing.
34
	private Vector3 m_Velocity = Vector3.zero;
Unknown's avatar
Unknown committed
35
	private int m_TempJumpCount = 0;
Unknown's avatar
Merge  
Unknown committed
36
	private bool m_Jumped = false;
37

Unknown's avatar
Unknown committed
38 39 40 41 42
	private RaycastHit2D[] m_RaycastHits2D = new RaycastHit2D[16];
	private ContactFilter2D m_ContactFilter2D;
	private Vector3 m_CurrentGroundNormal;

	[Header("Events")] [Space]
43

Unknown's avatar
Unknown committed
44
	//Wird Aktiviert wenn Spieler Landet
45
	public UnityEvent OnLandEvent;
46

Unknown's avatar
Unknown committed
47 48
	public UnityEvent OnSwimEvent;
	public UnityEvent OnJumpEvent;
49

50 51

	public void SetMovementParameters(MovementState state)
Unknown's avatar
Unknown committed
52
	{
53
		m_JumpForce = state.jumpForce;
54
		m_MovementSmoothing = state.smoothing;
55 56 57 58 59 60
		m_AirControl = state.airControl;
		m_CanSwim = state.canSwim;
		m_Speed = state.moveSpeed;
		m_MaxJumpCount = state.maxJumpCount;
		m_Rigidbody2D.mass = state.mass;
		m_Rigidbody2D.gravityScale = state.gravity;
Unknown's avatar
Unknown committed
61
	}
62

Unknown's avatar
Unknown committed
63 64 65 66 67
	private void Awake()
	{
		m_Rigidbody2D = GetComponent<Rigidbody2D>();

		m_ContactFilter2D.SetLayerMask(m_WhatIsGround);
68 69

		if (OnLandEvent == null)
Unknown's avatar
Unknown committed
70
			OnLandEvent = new UnityEvent();
71 72
	}

Unknown's avatar
Unknown committed
73 74
	private void FixedUpdate()
	{
75 76 77
		bool wasGrounded = m_Grounded;
		m_Grounded = false;

Unknown's avatar
Unknown committed
78
		// The player is grounded if a circlecast to the groundcheck position hits anything designated as ground
79
		// This can be done using layers instead but Sample Assets will not overwrite your project settings.
Unknown's avatar
Unknown committed
80
		/*Vector3 pos = m_GroundCheck.position + new Vector3(m_GroundedOffset.x, m_GroundedOffset.y);
81
		Collider2D[] colliders = Physics2D.OverlapCircleAll (pos, m_GroundedRadius, m_WhatIsGround);
Unknown's avatar
Unknown committed
82 83
		for (int i = 0; i < colliders.Length; i++) {
			if (colliders[i].gameObject != gameObject) {
84
				m_Grounded = true;
Unknown's avatar
Unknown committed
85 86 87
				m_TempJumpCount = m_MaxJumpCount;
				if (!wasGrounded)
					OnLandEvent.Invoke ();
88
			}
Unknown's avatar
Unknown committed
89
		}*/
Unknown's avatar
Unknown committed
90

Unknown's avatar
Unknown committed
91 92 93 94 95 96 97 98 99 100 101 102 103 104
		Vector3 pos = m_GroundCheck.position + new Vector3(m_GroundedOffset.x, m_GroundedOffset.y, 0);
		var c = Physics2D.CircleCast(pos, m_GroundedRadius, Vector2.down, m_ContactFilter2D, m_RaycastHits2D,
			m_GroundCheckDistance);
		for (var i = 0; i < c; i++)
		{
			if (m_RaycastHits2D[i].transform.gameObject == gameObject) continue;

			m_Grounded = true;
			m_TempJumpCount = m_MaxJumpCount;
			m_CurrentGroundNormal = m_RaycastHits2D[i].normal;
			if (!wasGrounded)
			{
				OnLandEvent.Invoke();
			}
105 106 107
		}
	}

Unknown's avatar
Unknown committed
108 109


Unknown's avatar
Unknown committed
110 111
	public void Move(Vector2 move, bool jump)
	{
112

113
		Debug.Log("grounded: " + m_Grounded + " aircontrol: " + m_AirControl);
114
		//only control the player if grounded or airControl is turned on
115
		if (m_Grounded || (m_AirControl && (m_Airborn && !m_Grounded)) || (m_Swimming && m_CanSwim))
Unknown's avatar
Unknown committed
116
		{
117
			// Move the character by finding the target velocity
Unknown's avatar
Unknown committed
118
			Vector2 targetVelocity = new Vector2((move.x * m_Speed * Time.deltaTime) * 10f, m_Rigidbody2D.velocity.y);
Unknown's avatar
Unknown committed
119

120
			// And then smoothing it out and applying it to the character
Unknown's avatar
Unknown committed
121 122
			m_Rigidbody2D.velocity = Vector3.SmoothDamp(m_Rigidbody2D.velocity, targetVelocity, ref m_Velocity,
				m_MovementSmoothing);
123 124

			// If the input is moving the player right and the player is facing left...
Unknown's avatar
Unknown committed
125 126
			if (move.x > 0 && !m_FacingRight)
			{
127
				// ... flip the player.
Unknown's avatar
Unknown committed
128
				Flip();
129 130
			}
			// Otherwise if the input is moving the player left and the player is facing right...
Unknown's avatar
Unknown committed
131 132
			else if (move.x < 0 && m_FacingRight)
			{
133
				// ... flip the player.
Unknown's avatar
Unknown committed
134
				Flip();
135 136
			}
		}
Unknown's avatar
Unknown committed
137

138
		// If the player should jump...
Unknown's avatar
Unknown committed
139 140
		if (jump)
		{
141
			if (((m_Grounded) || (m_TempJumpCount > 1) || (m_Swimming && m_CanSwim)) && !m_Jumped)
Unknown's avatar
Unknown committed
142
			{
Unknown's avatar
Unknown committed
143 144 145
				// Add a vertical force to the player.
				m_Grounded = false;
				m_TempJumpCount--;
Sebastian Frey's avatar
Sebastian Frey committed
146 147
				//m_Rigidbody2D.AddForce (new Vector2 (0f, m_JumpForce));
				m_Rigidbody2D.velocity = Vector2.up * m_JumpForce;
Unknown's avatar
Unknown committed
148
				OnJumpEvent.Invoke();
Unknown's avatar
Merge  
Unknown committed
149
				StartCoroutine(Wait(m_SecondsWaitToJump));
Unknown's avatar
Unknown committed
150
			}
151
		}
Sebastian Frey's avatar
Sebastian Frey committed
152

Unknown's avatar
Unknown committed
153
		if (m_Rigidbody2D.velocity.y < 0 && !m_Swimming && !m_Grounded)
Sebastian Frey's avatar
Sebastian Frey committed
154 155
		{
			m_Rigidbody2D.velocity += Vector2.up * Physics2D.gravity.y * (m_fallMultiplier - 1) * Time.deltaTime;
156
		}
157 158 159 160
		//else if (m_Rigidbody2D.velocity.y > 0 && !Input.GetButton("Jump"))
		//{
		//	m_Rigidbody2D.velocity += Vector2.up * Physics2D.gravity.y * (m_lowJumpMultiplier - 1) * Time.deltaTime;
		//}
Unknown's avatar
Merge  
Unknown committed
161
	}
162

Unknown's avatar
Unknown committed
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187
	public void SetSwimming(bool value)
	{
		m_Swimming = value;
		if (value)
		{
			OnSwimEvent.Invoke();
			m_TempJumpCount = m_MaxJumpCount;
		}
	}

	public bool Swimming
	{
		get => m_Swimming;
	}

	public bool Grounded
	{
		get => m_Grounded;
	}

	public void AddJumpCharge(int amount)
	{
		m_TempJumpCount += amount;
	}

Unknown's avatar
Merge  
Unknown committed
188 189 190 191 192
	private IEnumerator Wait(float s)
	{
		m_Jumped = true;
		yield return new WaitForSeconds(s);
		m_Jumped = false;
Unknown's avatar
Unknown committed
193
	}
194

Unknown's avatar
Unknown committed
195 196
	private void Flip()
	{
197 198 199 200 201 202 203 204 205
		// Switch the way the player is labelled as facing.
		m_FacingRight = !m_FacingRight;

		// Multiply the player's x local scale by -1.
		Vector3 theScale = transform.localScale;
		theScale.x *= -1;
		transform.localScale = theScale;
	}

206 207
	private void OnCollisionEnter2D(Collision2D other)
	{
Unknown's avatar
Unknown committed
208
		if(other.gameObject.layer == m_WhatIsGround)
209 210 211 212 213
		m_Airborn = false;
	}

	private void OnCollisionExit2D(Collision2D other)
	{
Unknown's avatar
Unknown committed
214
		if(other.gameObject.layer == m_WhatIsGround)
215 216 217
		m_Airborn = true;
	}

Unknown's avatar
Unknown committed
218 219 220

	void OnDrawGizmos()
	{
221
		Gizmos.color = Color.green;
Unknown's avatar
Unknown committed
222 223 224 225
		Vector3 pos = m_GroundCheck.position + new Vector3(m_GroundedOffset.x, m_GroundedOffset.y, 0);
		//Gizmos.DrawWireSphere (m_GroundCheck.position + new Vector3(m_GroundedOffset.x, m_GroundedOffset.y, 0), m_GroundedRadius);
		Gizmos.DrawRay(pos, Vector3.down * m_GroundCheckDistance);
		Gizmos.DrawWireSphere(pos + Vector3.down * m_GroundCheckDistance, m_GroundedRadius);
Unknown's avatar
Unknown committed
226
	}
mthiele2's avatar
mthiele2 committed
227
}