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
}