public void Moving() { //Debug.Log(player.forward); Vector3 forward = player.forward * movement.z; //двигаемся вперед/назад относительно того куда смотрит игрок Vector3 right = player.right * movement.x; //двигаемся влево/вправо относительно того куда смотрит игрок if (!GlobalInfo.CheckWallRun()) { if (GlobalInfo.CheckGround()) { body.MovePosition(body.position + forward * speed * Time.fixedDeltaTime);//осуществялем передвижение вперед/назад } else { body.MovePosition(body.position + forward * speedMove / 2 * Time.fixedDeltaTime);//осуществялем передвижение вперед/назад } //Debug.Log("Move"); } else { jumps = 0; } if (GlobalInfo.CheckGround()) { body.MovePosition(body.position + right * speed * Time.fixedDeltaTime);//осуществялем передвижение влево/вправо } else { body.MovePosition(body.position + right * speedMove / 2 * Time.fixedDeltaTime);//осуществялем передвижение влево/вправо } }
//функция прыжка void Jump() { Vector3 vec = new Vector3(0, jumpForce, 0); if (Input.GetAxisRaw("Vertical") > 0) { vec.x = player.forward.x * speedMove / 2; vec.z = player.forward.z * speedMove / 2; } else { if (Input.GetAxisRaw("Vertical") != 0) { vec.x = -player.forward.x * speedMove / 2; vec.z = -player.forward.z * speedMove / 2; } } if (Input.GetAxisRaw("Horizontal") > 0) { vec.x = (vec.x + player.right.x * speedMove / 2) / 2; vec.z = (vec.z + player.right.z * speedMove / 2) / 2; } else { if (Input.GetAxisRaw("Horizontal") != 0) { vec.x = (vec.x + (-player.right.x * speedMove / 2)) / 2; vec.z = (vec.z + (-player.right.z * speedMove / 2)) / 2; } } if (Input.GetKeyDown(KeyCode.Space) && (GlobalInfo.CheckGround() && !GlobalInfo.CheckWallRun()))//если нажали пробел и на земле { Debug.Log("Kick"); body.velocity = vec;//пинаем вверх audio.Play("Jump"); } else { if (Input.GetKeyDown(KeyCode.Space) && jumps != nJumps && !GlobalInfo.CheckWallRun()) { body.velocity = vec;//пинаем вверх audio.Play("Jump" + jumps); jumps++; } } }
// Update is called once per frame void Update() { CheckClimbing(); if (bodySee && !headSee) { Debug.Log("Можем подниматься"); } if (bodySee && !headSee && !GlobalInfo.CheckGround() && Input.GetAxisRaw("Vertical") > 0 && !isClimbing) //если в вохдухе и двигаемся вперед { //голова не видит стену,а тело видит то начинаем взбираться Debug.Log("Поднимаемся"); upPos = player.position; upPos.y = newPos.y; isClimbing = true; //помечаем это body.useGravity = false; //отрубаем гравитаюци. player.GetComponent <Control>().enabled = false; //отбираем управление у игрока Debug.Log("NewPos:" + newPos); } }
void SitDown() { if (Input.GetKey(KeyCode.C) && GlobalInfo.CheckGround()) { if (GlobalInfo.ChecPodkat() && timer1 > 0) { timer1 -= Time.deltaTime;//подкат speed = podkatSpeed; Debug.Log("PodkatSpeed"); } else { speed = speedMove / 2;//сидим Debug.Log("MoveSpeed"); } animator.SetBool("Sit", true); isSitDown = true; } else { bool upDown = false; if (isSitDown) { RaycastHit hit; Ray ray = new Ray(transform.position, Vector3.up * 1); //создаем луч направленный вверх if (Physics.Raycast(ray, out hit, 1, layerMask)) //выпускаем луч определннеой длинны { upDown = true; } else { upDown = false; } } if (!upDown) { timer1 = longOfPodkat; speed = speedMove; animator.SetBool("Sit", false); isSitDown = false; } } }
//пускаем лучи что бы понять есть ли стена справа и слева void WallRun() { if (Input.GetAxisRaw("Vertical") > 0 && (parkourAvailableRight || parkourAvailableLeft) && !GlobalInfo.CheckGround())//если бежим вперед, около стены и в вохдухе { GlobalInfo.ChangePodkat(true); if (Input.GetKeyDown(KeyCode.Space)) //если нам надо оттолкнуться от стены во время { //бега по стенам Vector3 vec; //вектор прыжка timer = 0.2f; //отключаем бег по стена на 0.2 Debug.Log(player.transform.right); if (parkourAvailableLeft) { vec = player.transform.right;//если надо отпрыгнуть врпаво } else { vec = -player.transform.right;//если надо отпрыгнуть влево } vec = vec * jumpForce; //vec.y = jumpForce;//прыжок не только в сторону но и вверх Debug.Log("vec=" + vec); Vector3 vec2 = new Vector3(0, jumpForce, 0); if (Input.GetAxisRaw("Vertical") > 0) { vec2.x = player.forward.x * speedMove / 2; vec2.z = player.forward.z * speedMove / 2; } else { if (Input.GetAxisRaw("Vertical") != 0) { vec2.x = -player.forward.x * speedMove / 2; vec2.z = -player.forward.z * speedMove / 2; } } body.velocity = vec + vec2;//делаем толчок } else { if (timer <= 0) { GlobalInfo.ChangeWallRun(true); if (parkourAvailableLeft) { animator.SetBool("WallLeft", true); } else { animator.SetBool("WallRight", true); } body.velocity = new Vector2(0, 0); //то значит бежим по стене body.MovePosition(body.position + wallRunVec * speedMove * Time.deltaTime); //осуществялем передвижение } else { timer -= Time.deltaTime; } } Debug.Log("Бежим по стене"); } else { GlobalInfo.ChangeWallRun(false); animator.SetBool("WallLeft", false); animator.SetBool("WallRight", false); } }