Я новичок в единстве и следую инструкциям. Я делаю скрипт, который перемещает 3D-плеер с помощью CharacterController, и я прикрепил еще один скрипт, который добавляет возможность толкать RigidBodys, но как я могу заставить Player толкать другого Player? Он просто сталкивается, но ничего не происходит, и я не хочу делать его твердым телом.
//Script that i use as PlayerController
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerController : MonoBehaviour
{
public float horizontalMove;
public float verticalMove;
private Vector3 playerInput;
public CharacterController player;
public float playerSpeed;
public Vector3 movePlayer;
public float gravity = 9.8f;
public float fallVelocity;
public float jumpForce;
public Camera mainCamera;
private Vector3 camForward;
private Vector3 camRight;
public bool isOnSlope = false;
private Vector3 hitNormal;
public float slideVelocity;
public float slopeForceDown;
private PushRigidBody pushRigid;
public float pushPlus;
// Start is called before the first frame update
void Start()
{
player = GetComponent<CharacterController>();
//Obtengo el componente Script "PushRigidBody" para poder usar sus metodos y cambiar variables con sus mutadores
pushRigid = GetComponent<PushRigidBody>();
}
// Update is called once per frame
void Update()
{
horizontalMove = Input.GetAxis("Horizontal");
verticalMove = Input.GetAxis("Vertical");
playerInput = new Vector3(horizontalMove, 0, verticalMove);
playerInput = Vector3.ClampMagnitude(playerInput, 1);
camDirection();
movePlayer = playerInput.x * camRight + playerInput.z * camForward;
movePlayer = movePlayer * playerSpeed;
player.transform.LookAt(player.transform.position + movePlayer);
SetGravity();
PlayerSkills();
player.Move(movePlayer * playerSpeed * Time.deltaTime);
}
private void FixedUpdate()
{
}
void camDirection()
{
camForward = mainCamera.transform.forward;
camRight = mainCamera.transform.right;
camForward.y = 0;
camRight.y = 0;
camForward = camForward.normalized;
camRight = camRight.normalized;
}
//Funcion para habilidades de jugador
public void PlayerSkills()
{
if (player.isGrounded && Input.GetButtonDown("Jump"))
{
fallVelocity = jumpForce;
movePlayer.y = fallVelocity;
}
//Detecta si presiono la tecla para golpear objeto y aventarlo, si la aprieta aumenta la fuerza con la que golpea, si no, la vuelve a dejar como estaba
if (Input.GetButton("Fire1"))
{
pushRigid.SetPushPower(pushPlus);
}
else
{
pushRigid.SetPushPower( 0f );
}
}
void SetMov(Vector3 vector)
{
movePlayer = movePlayer - vector;
}
void SetGravity()
{
if (player.isGrounded)
{
fallVelocity = -gravity * Time.deltaTime;
movePlayer.y = fallVelocity;
}
else
{
fallVelocity -= gravity * Time.deltaTime;
movePlayer.y = fallVelocity;
}
SlideDown();
}
//Compara si esta o no en una rampa y aplica fuerzas para deslizar
public void SlideDown()
{
//isOnSlope = angulo >= angulo maximo del charcontroller
isOnSlope = Vector3.Angle(Vector3.up, hitNormal) >= player.slopeLimit;
if (isOnSlope)
{
movePlayer.x += ((1f - hitNormal.y) * hitNormal.x) * slideVelocity;
movePlayer.z += ((1f - hitNormal.y) * hitNormal.z) * slideVelocity;
movePlayer.y += slopeForceDown;
}
}
private void OnControllerColliderHit(ControllerColliderHit hit)
{
hitNormal = hit.normal;
}
}
----------
///Script that i use for push rigidbodys
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PushRigidBody : MonoBehaviour
{
public float pushPower = 2.0f;
private float pushPowerPlus = 0f;
private void OnControllerColliderHit(ControllerColliderHit hit)
{
Rigidbody body = hit.collider.attachedRigidbody;
if (body == null || body.isKinematic)
{
return;
}
//Si caemos encima de un objeto no queremos empujarlo, se pone encima de el
if (hit.moveDirection.y < -0.8)
{
return;
}
Vector3 pushDir = new Vector3(hit.moveDirection.x, 0, hit.moveDirection.z);
;
body.velocity = pushDir * (pushPower + pushPowerPlus);
}
public void SetPushPower(float pushPowerVar)
{
pushPowerPlus = pushPowerVar;
}
}