- Home /
Make character not move through walls and other objects
My character/Player[polyman] is passing through walls and other objects ,my player had attached with character controller ,rigidbody Is kinematic in inspector.Below is my Player's script. What i done wrong in script ,Can i add anything in script? .I added colliders to all obstacles including player.I took some screenshots in my inspector. pls answer anyone!!!@rage_co
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
//VARIABLES
[SerializeField] private float moveSpeed;
[SerializeField] private float walkSpeed;
[SerializeField] private float runSpeed;
private Vector3 moveDirection;
private Vector3 velocity;
[SerializeField] private bool isGrounded;
[SerializeField] private float groundCheckDistance;
[SerializeField] private LayerMask groundMask;
[SerializeField] private float gravity;
[SerializeField] private float jumpHeight;
//REFERENCES
private CharacterController controller;
private Animator anim;
private void Start()
{
controller = GetComponent<CharacterController>();
anim = GetComponent<Animator>();
}
private void FixedUpdate()
{
Move();
}
private void Move()
{
isGrounded = Physics.CheckSphere(transform.position, groundCheckDistance, groundMask);
if(isGrounded && velocity.y < 0)
{
velocity.y = -2f;
}
float moveZ = Input.GetAxis("Vertical");
moveDirection = new Vector3(0, 0, moveZ);
moveDirection = transform.TransformDirection(moveDirection);
if (isGrounded)
{
if (moveDirection != Vector3.zero && !Input.GetKey(KeyCode.LeftShift))
{
Walk();
}
else if (moveDirection != Vector3.zero && Input.GetKey(KeyCode.LeftShift))
{
Run();
}
else if (moveDirection == Vector3.zero)
{
Idle();
}
moveDirection *= moveSpeed;
if (Input.GetKeyDown(KeyCode.Space))
{
Jump();
}
}
controller.Move(moveDirection * Time.deltaTime);
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
}
private void Idle()
{
anim.SetFloat("Speed", 0, 0.1f, Time.deltaTime);
}
private void Walk()
{
moveSpeed = walkSpeed;
anim.SetFloat("Speed", 0.5f, 0.1f, Time.deltaTime);
}
private void Run()
{
moveSpeed = runSpeed;
anim.SetFloat("Speed", 1,0.1f,Time.deltaTime);
}
private void Jump()
{
velocity.y = Mathf.Sqrt(jumpHeight * -2 * gravity);
}
}
its not a problem with the character or the script...i believe the trees don't have a collider
well i meant to say walls, just add colliders to all obstacles, i guess i was seeing some memes so got a bit distracted there....
I added colliders to both player and cube (wall)but Not worked!!Is trigger is unchecked in both!! But not worked!! Any help!!
can you share a screenshot of the inspector screen of the player and the wall?
I added scrrenshots of inspector of player and wall. pls can you check if anything wrong!!
Answer by rage_co · Aug 20, 2021 at 04:13 AM
sorry...im late cuz i just woke up like an hour ago....now for the problem, why do you have a capsule collider with a character controller? the controller comes with it's own collider and this just might be the problem...so try removing the capsule collider....also what is the physic material you are using on the colliders (i don't think it's the problem , just confirming), also head to the project settings in editor > physics category and check that the collision matrix is properly setup
Thanks! It worked by removing capsule collider and in physics collider matrix is checked with player and collider .I made in inspector Layer as player in player and wall in layer as collider.So,It Worked!!Thanks a Lott!!!
Answer by unity_8jz2K_QgYq8cUw · Aug 19, 2021 at 11:04 AM
Firstly, do u have a charactercontroller and a rigidbody on one object? Secondly do u have colliders on everything if it isnt sinking through the floor? Lastly, is the rigidbody’S collider being disabled due to the charactercontroller?
1)-YES, I have a charactercontroller and a rigidbody on one object(player) 2)Even without colliders on everything is not sinking through the floor. But, I have colliders on everything 3)no. rigidbody's colliders not disabled. I had applied all your conditions above. But ,Didn't works still passing through objects.. Any Help!!
you should NOT have a rigidbody with a character controller, i's not necessary for simple collisions and might even break them
Answer by mischkom · Aug 20, 2021 at 04:22 AM
https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html
"If isKinematic is enabled, Forces, collisions or joints will not affect the rigidbody anymore. "
You need to make sure to disable isKinematic (at the right time) if you want collisions with walls to prevent your character from passing through.
Answer by parmardarshanv · Aug 20, 2021 at 07:36 AM
You should add RigidBody to your player and make sure isKinematic is unchecked. I think that should work.
Your answer
Follow this Question
Related Questions
check if two colliders Rub against each other 1 Answer
Movement based on collision on a custom mesh 0 Answers
How to Have Two Child Objects of One Parent Detect Collisions Between Eachother. 1 Answer
Separate Objects after Mouse Clicking in Unity 5.6.4 1 Answer
Player getting stuck in ground (3D) player has Rigidbody, and Box Collider, world is Mesh Colliders 0 Answers