using UnityEngine; using System.Collections; [RequireComponent(typeof(Rigidbody))] public class Child : MonoBehaviour { public float Speed = 10f; public float JumpForce = 10f; public float MaxInvulnerableTime = 2f; public float ThrowForce = 30f; public float hitPushBackForce = 250f; public float yAngleVector = 9f; public GameObject GroundCheck; public Pillow pillow; public MomBehavior Mom; public Animator Animator; private Rigidbody _rb; private bool _isGrounded = false; private float _xValue; private float _zValue; private bool _isSleeping; private float _invulnerableTime; private Bed _currentBed; public Transform target; private bool _isInLava; private int _index; private bool _isPushed = false; private bool _wasPushed = false; private Vector3 _pushedDir; private float _stunTime; public int Index { get { return _index; } set { _index = value; } } public bool IsSleeping { get { return _isSleeping; } } void Awake() { _rb = GetComponent(); } void Update() { Animator.SetBool("IsOnBed", GetBed()); _isGrounded = IsGrounded(); Debug.Log(_isGrounded); // look at the target if (target != null) { transform.LookAt(target); } // We move the child depending on the camera orientation if (_stunTime >= Time.deltaTime * 3f && _wasPushed && _rb.velocity == Vector3.zero) { _wasPushed = false; } if (_isPushed) { _stunTime += Time.deltaTime; if (_stunTime >= Time.deltaTime * 3f && _rb.velocity == Vector3.zero) { _isPushed = false; _wasPushed = true; } } else { _stunTime = 0f; Vector3 forwardDir = Camera.main.transform.forward; Vector3 rightDir = Camera.main.transform.right; forwardDir.y = 0f; forwardDir = forwardDir.normalized * _zValue * Speed; rightDir.y = 0f; rightDir = rightDir.normalized * _xValue * Speed; Vector3 movement = forwardDir + rightDir; movement.y = _rb.velocity.y; _rb.velocity = movement; } } void OnTriggerEnter(Collider other) { if (other.tag == "Pillow"){ Pillow incomingPillow = other.GetComponent(); // picking up a pillow if (this.pillow == null && incomingPillow.IsPickable) { pillow = incomingPillow; pillow.transform.parent = transform; // make the pillow a child of Child pillow.transform.localPosition = new Vector3(0f, 1.5f, 0f); pillow.GetComponent().isKinematic = true; // dont make pillow obey to gravity when in a child's hands pillow.IsOwned = true; // TODO: place the pillow correctly or animate or something... } // getting hit by a pillow else if (incomingPillow.IsThrown) { //player is hit Debug.Log("Child is hit by a pillow"); Push( other.GetComponent().velocity.normalized * 10 * hitPushBackForce); Destroy(other.gameObject); } } } private bool IsGrounded() { int mask = (1 << LayerMask.NameToLayer("Ground")) | (1 << LayerMask.NameToLayer("Bed")); Collider[] colliders = Physics.OverlapSphere(GroundCheck.transform.position, 0.149f, mask); return colliders.Length > 0; } public void Move(float xValue, float zValue) { _xValue = xValue; _zValue = zValue; } public void Jump() { if (_isGrounded) { _isGrounded = false; _rb.AddForce(new Vector3(0f, JumpForce, 0f)); Animator.SetTrigger("jump"); } } public bool Sleep() { Bed bed = GetBed(); if (bed != null && !bed.IsTaken) { _currentBed = bed; bed.Take(); _isSleeping = true; Animator.SetBool("IsSleeping", true); } return _isSleeping; } public void WakeUp() { _isSleeping = false; Animator.SetBool("IsSleeping", false); _currentBed.Leave(); _currentBed = null; } public Bed GetBed() { Collider[] colliders = Physics.OverlapSphere(GroundCheck.transform.position, 0.149f, 1 << LayerMask.NameToLayer("Bed")); return colliders.Length > 0 ? colliders[0].GetComponent() : null; } internal void Throw() { if (_isInLava) return; if (pillow != null) { Vector3 direction; if (target != null) { direction = target.transform.position - pillow.transform.position; } else { direction = transform.forward; } direction = direction.normalized; pillow.Throw(direction * ThrowForce); pillow.IsOwned = false; pillow = null; Animator.SetTrigger("StartAttack"); } } void OnCollisionEnter(Collision collision) { if (collision.gameObject.tag == "Lava") { Debug.Log("Player " + _index + " entered lava. Lose one life."); TakeLavaDamage(); ActivateVibration(true); Animator.SetBool("IsOnLava", true); _isInLava = true; } else { // Setup for the next time the player falls on the lava _invulnerableTime = MaxInvulnerableTime; if (collision.gameObject.tag == "Floor") { ActivateVibration(false); } } } void OnCollisionExit(Collision collision) { if (collision.gameObject.tag == "Lava" || collision.gameObject.tag == "Floor") { ActivateVibration(false); Animator.SetBool("IsOnLava", false); _isInLava = false; } } void OnCollisionStay(Collision collision) { if (collision.gameObject.tag == "Walls") { Debug.Log(_isPushed); } if (collision.gameObject.tag == "Lava") { _invulnerableTime += Time.deltaTime; if (_invulnerableTime >= MaxInvulnerableTime) { Debug.Log("Player " + _index + " is still standing on lava. Lose one life."); TakeLavaDamage(); } ActivateVibration(true); } else if (collision.gameObject.tag == "Floor") { ActivateVibration(false); } else if (_wasPushed && collision.gameObject.tag == "Walls") { _wasPushed = false; Push(Vector3.Reflect(_pushedDir.normalized, collision.contacts[0].normal) * _pushedDir.magnitude); } } public void Push(Vector3 force) { _isPushed = true; Debug.Log(force); force.y = yAngleVector; _rb.AddForce(force, ForceMode.Impulse); _pushedDir = force; } private void ActivateVibration(bool activate) { float intensity = activate ? 0.3f : 0f; XInputDotNetPure.GamePad.SetVibration((XInputDotNetPure.PlayerIndex)_index, intensity, intensity); } private void TakeLavaDamage() { // TODO: Lose a life (probably) and become immune for ~ 2 or 3 seconds _invulnerableTime = 0f; } void OnDestroy() { ActivateVibration(false); } }