Hi, I am trying to make a humanoid swim, my first attempt to get out of water was to compare the borders of the swimming pool, with the character position, but i thought it isn’t the corect way to do it, so I tried to use collision detection, I am breaking my head since then. Could somebody gime a hand with that Please, Thank You.
This is my script:
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float speed = 6.0F;
public float jumpSpeed = 8.0F;
public float gravity = 9.81F;
private float swimm = 0.0F;
public Vector3 moveDirection = Vector3.zero;
public CharacterController controller;
public Animator anim;
public bool water = false;
// Start is called before the first frame update
void Start()
{
controller = GetComponent<CharacterController>();
anim = GetComponent<Animator>();
}
// Update is called once per frame
void Update()
{
if (controller.isGrounded)
{
if (!water)
{
swimm = Input.GetAxis("Horizontal");
if (swimm < 0)
{
anim.SetFloat("Speed", swimm * -1);
}
else
{
anim.SetFloat("Speed", swimm);
}
swimm = Input.GetAxis("Vertical");
if (swimm < 0)
{
anim.SetFloat("Speed", swimm * -1);
}
else
{
anim.SetFloat("Speed", swimm);
}
moveDirection = new Vector3(0, 0, swimm);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
if (Input.GetKey(KeyCode.UpArrow))
{
anim.ResetTrigger("Idle");
anim.SetTrigger("Walk");
}
if (Input.GetKeyUp(KeyCode.UpArrow))
{
anim.ResetTrigger("Walk");
anim.SetTrigger("Idle");
}
if (Input.GetKey(KeyCode.DownArrow))
{
anim.ResetTrigger("Idle");
anim.SetTrigger("Walk");
}
if (Input.GetKeyUp(KeyCode.DownArrow))
{
anim.ResetTrigger("Walk");
anim.SetTrigger("Idle");
}
if (Input.GetKeyDown(KeyCode.LeftControl))
moveDirection.y = jumpSpeed;
if (transform.position.y < 5.0F)
{
water = true;
anim.ResetTrigger("Walk");
anim.ResetTrigger("Idle");
anim.SetTrigger("Float");
}
}
}
transform.Rotate(0, Input.GetAxis("Horizontal"), 0);
if (!water)
{
moveDirection.y -= gravity * Time.deltaTime;
controller.Move(moveDirection * Time.deltaTime);
}
else
{
swimm = Input.GetAxis("Horizontal");
if (swimm < 0)
{
anim.SetFloat("Speed", swimm * -1);
}
else
{
anim.SetFloat("Speed", swimm);
}
swimm = Input.GetAxis("Vertical");
if (swimm < 0)
{
anim.SetFloat("Speed", swimm * -1);
}
else
{
anim.SetFloat("Speed", swimm);
}
moveDirection = new Vector3(0, 0, swimm);
moveDirection = transform.TransformDirection(moveDirection);
moveDirection *= speed;
controller.Move(moveDirection * Time.deltaTime);
transform.position = new Vector3(transform.position.x, 3.6F, transform.position.z);
if (transform.position.x > 11.9F || transform.position.x < -11.9F || transform.position.z > 6.9F || transform.position.z < -6.9F)
{
transform.position = new Vector3(transform.position.x, 5.0F, transform.position.z);
water = false;
anim.ResetTrigger("Float");
anim.SetTrigger("Idle");
}
}
}
/*void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.gameObject.tag.Equals("Border"))
{
transform.position = new Vector3(transform.position.x, 5.0F, transform.position.z);
water = false;
anim.ResetTrigger("Float");
anim.SetTrigger("Idle");
}
}*/
/*void OnTriggerEnter(Collider col)
{
if (col.tag.Equals("Border"))
{
transform.position = new Vector3(transform.position.x, 5.0F, transform.position.z);
water = false;
anim.ResetTrigger("Float");
anim.SetTrigger("Idle");
}
}*/
}