Hi everyone, I apologize if my question may sound trivial, but I need your help. I’m working on a project to recreate a remake of KulaWorld, an old game for PS1 where a ball rolls around and collects objects to complete the level. The ball can roll on cubes, even upside down. I’ve implemented a system using Raycasts, where if they hit the “ground” on Layer 8, it behaves in a certain way. Now, I want the Raycasts to detect invisible walls on Layer 10, so that the ball cannot pass through them. The problem is that the Raycasts are hitting objects on Layer 8 and not on Layer 10. Can someone help me?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
public float speed;
public RollingBall ball;
public Animator ballAnim;
private bool isMoving = false;
private Vector3 rayFrontDirection;
private Vector3 rayDownDirection;
private Vector3 rayFrontDownDirection;
private void Start()
{
recalculateRay();
}
private void Update()
{
if (Input.GetKey(KeyCode.Space))
{
JumpForward(2);
if (Input.GetAxis("Vertical") > 0)
{
jumpAndMove(2);
}
}
if (Input.GetKeyUp(KeyCode.Space))
{
StartCoroutine(smoothJump(2));
AudioManager.Instance.PlayJumpSound();
}
if (Input.GetAxis("Vertical") > 0)
{
move();
}
else if (Input.GetKeyDown(KeyCode.A))
{
rotateLeft();
}
else if (Input.GetKeyDown(KeyCode.D))
{
rotateRight();
}
}
void JumpForward(float offset)
{
StartCoroutine(smoothMoveAndJump(offset, 4));
}
void recalculateRay()
{
rayFrontDirection = transform.right;
rayDownDirection = -transform.up;
rayFrontDownDirection = transform.right - transform.up * 0.5f;
}
bool projectRay(Vector3 dir, float lenght = 3)
{
int layerMask = 1 << 8; // Layer 8: Muri, Layer 9: Player
RaycastHit hit;
Vector3 start = transform.position + transform.up / 2;
if (Physics.Raycast(start, dir, out hit, lenght, layerMask))
{
Debug.DrawRay(start, dir * 1000, Color.red);
Debug.Log("Il raycast ha colpito: " + hit.collider.gameObject.name);
return true;
}
else
{
Debug.DrawRay(start, dir * 1000, Color.white);
return false;
}
}
GameObject getRayHit(Vector3 start, Vector3 dir, float lenght = 3)
{
int layerMask = (1 << 8) | (1 << 10);
RaycastHit hit;
if (Physics.Raycast(start, dir, out hit, lenght, layerMask))
{
Debug.DrawRay(start, dir * 1000, Color.red);
return hit.collider.gameObject;
}
else
{
Debug.DrawRay(start, dir * 1000, Color.white);
return null;
}
}
IEnumerator smoothMove(float offset)
{
Vector3 targetPos = transform.position + transform.right * offset;
while (Vector3.Distance(transform.position, targetPos) > 0.0001f)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPos, step);
ball.roll(-step * 100);
yield return null;
}
}
IEnumerator moveFront(float offset = 2)
{
if (isMoving)
{
yield break;
}
isMoving = true;
yield return StartCoroutine(smoothMove(offset));
isMoving = false;
}
IEnumerator moveUP()
{
if (isMoving)
{
yield break;
}
isMoving = true;
yield return StartCoroutine(smoothMove(0.5f));
Vector3 eulerUpAngle = new Vector3(0, 0, 90);
yield return StartCoroutine(smoothRotation(eulerUpAngle));
yield return StartCoroutine(smoothMove(0.5f));
isMoving = false;
}
IEnumerator moveDown()
{
if (isMoving)
{
yield break;
}
isMoving = true;
yield return StartCoroutine(smoothMove(1.5f));
Vector3 eulerDownAngle = new Vector3(0, 0, -90);
yield return StartCoroutine(smoothRotation(eulerDownAngle));
yield return StartCoroutine(smoothMove(1.5f));
isMoving = false;
}
void move()
{
recalculateRay();
if (!projectRay(rayDownDirection, 1.5f))
{
return;
}
if (projectRay(rayFrontDirection, 1.5f))
{
StartCoroutine(moveUP());
}
else if (projectRay(rayFrontDownDirection))
{
StartCoroutine(moveFront());
}
else
{
StartCoroutine(moveDown());
}
}
IEnumerator smoothRotation(Vector3 angle)
{
float duration = 10;
for (int t = 0; t < duration; t++)
{
transform.Rotate(angle / duration);
yield return null;
}
}
IEnumerator rotateLeftsmooth()
{
if (isMoving)
{
yield break;
}
isMoving = true;
yield return StartCoroutine(smoothRotation(new Vector3(0, -90, 0)));
isMoving = false;
}
IEnumerator rotateRightsmooth()
{
if (isMoving)
{
yield break;
}
isMoving = true;
yield return StartCoroutine(smoothRotation(new Vector3(0, 90, 0)));
isMoving = false;
}
void rotateLeft()
{
StartCoroutine(rotateLeftsmooth());
}
void rotateRight()
{
StartCoroutine(rotateRightsmooth());
}
IEnumerator smoothJump(float offset)
{
if (isMoving)
{
yield break;
}
isMoving = true;
Vector3 targetPos = transform.position + transform.up * offset;
while (Vector3.Distance(transform.position, targetPos) > 0.0001f)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPos, step);
ball.roll(-step * 200);
yield return null;
}
targetPos = transform.position - transform.up * offset;
while (Vector3.Distance(transform.position, targetPos) > 0.0001f)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPos, step);
ball.roll(-step * 200);
yield return null;
}
isMoving = false;
ballAnim.Play("Jump", -1);
}
void Jump(float offset)
{
StartCoroutine(smoothJump(offset));
}
IEnumerator smoothMoveAndJump(float jumpOffset, float moveOffset)
{
if (isMoving)
{
yield break;
}
isMoving = true;
recalculateRay();
bool flyDown = false;
if (projectRay(rayFrontDirection, 1))
{
moveOffset = 0;
}
else if (projectRay(rayFrontDirection, moveOffset))
{
moveOffset = moveOffset / 2;
}
Vector3 targetPos = transform.position + (transform.up * jumpOffset) + (transform.right * moveOffset);
GameObject block = getRayHit(targetPos, rayDownDirection, 10);
float landingOffset = jumpOffset;
if (moveOffset != 0)
{
if (block != null)
{
float distance = Vector3.Distance(targetPos, block.transform.position) - 1.5f;
distance = Mathf.Abs(distance);
landingOffset = distance;
}
else
{
landingOffset = 10;
flyDown = true;
}
}
while (Vector3.Distance(transform.position, targetPos) > 0.00001f)
{
float step = 2 * speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPos, step);
ball.roll(-step * 200);
yield return null;
}
targetPos = transform.position - transform.up * landingOffset;
while (Vector3.Distance(transform.position, targetPos) > 0.0001f)
{
float step = 2 * speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, targetPos, step);
ball.roll(-step * 200);
yield return null;
}
ballAnim.Play("Jump", -1);
if (flyDown)
{
Manager.Instance.InitDie();
}
isMoving = false;
}
void jumpAndMove(float offset)
{
StartCoroutine(smoothMoveAndJump(offset, offset * 2));
}
}