Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как сделать, чтобы персонаж не проходил сквозь стены в Unity 3D?

Лев Еров Ученик (239), на голосовании 5 месяцев назад
Всем добрый день! Как модифицировать этот скрипт чтобы персонаж не проходил сквозь стены?
using UnityEngine;
using System.Collections;

public class MotionController : MonoBehaviour
{
public float speed = 5.0f;
public float cellSize = 1.0f;
bool isMoving = false;
Vector3 direction;
Vector3 destPos;

void Update()
{
if (isMoving == true)
{
float step = speed * Time.deltaTime;
transform.position = Vector3.MoveTowards(transform.position, destPos, step);
if (transform.position == destPos) isMoving = false;
}
else
{
if (Input.GetKeyDown(KeyCode.W))
{
direction = Vector3.forward;
destPos = transform.position + direction * cellSize;
isMoving = true;
}
if (Input.GetKeyDown(KeyCode.A))
{
direction = Vector3.left;
destPos = transform.position + direction * cellSize;
isMoving = true;
}
if (Input.GetKeyDown(KeyCode.D))
{
direction = Vector3.right;
destPos = transform.position + direction * cellSize;
isMoving = true;
}
if (Input.GetKeyDown(KeyCode.S))
{
direction = Vector3.back;
destPos = transform.position + direction * cellSize;
isMoving = true;
}
}
}
}
Голосование за лучший ответ
Tokyo Ghoul Гуру (2839) 6 месяцев назад
да тут легче можно.
1. Добавь компоненту Rigidbody к персонажу.
2. Выбери для персонажа коллайдер, например, капсульный коллайдер.
3. Создай коллайдер на стене, например, коробочный коллайдер.
4. Перемещай персонажа с помощью функции Rigidbody.MovePosition или задавая скорость с помощью Rigidbody.velocity = new Vector3(newVelocity).
5.Убедиcь что флажок «Is Kinematic» компонента Rigidbody персонажа снят (установлено значение false).
Лев ЕровУченик (239) 6 месяцев назад
Сейчас проверим
Лев ЕровУченик (239) 6 месяцев назад
Можете скрипт отредактировать?
Tokyo Ghoul Гуру (2839) Лев Еров, неа, со скриптами толком не работаю, сорян)
Лев ЕровУченик (239) 6 месяцев назад
Можешь сказать что конкретнее заменить надо?
Лев ЕровУченик (239) 6 месяцев назад
Не знаешь случайно, как в Rigidbody.MovePosition задать скорость передвижения?
Tokyo Ghoul Гуру (2839) Лев Еров, Чтобы задать скорость передвижения в Rigidbody.MovePosition, используйте метод AddForce. Например, если вы хотите переместить объект со скоростью 5 метров в секунду, используйте следующий код: Rigidbody rb; rb.AddForce(5 * Time.deltaTime, ForceMode.VelocityChange); Здесь rb — это ссылка на Rigidbody объекта, а ForceMode.VelocityChange указывает, что сила должна быть применена как изменение скорости.
Лев ЕровУченик (239) 6 месяцев назад
Assets\resources\script\movePlayer.cs(22,25): error CS1503: Argument 1: cannot convert from 'float' to 'UnityEngine.Vector3'
Лев Еров Ученик (239) Лев Еров, ошибку выдает
Лев ЕровУченик (239) 6 месяцев назад
float step = speed * Time.deltaTime;
m_Rigidbody.AddForce((int) 5 * Time.deltaTime, ForceMode.VelocityChange);
m_Rigidbody.MovePosition(destPos);
if (transform.position == destPos) isMoving = false;
Лев Еров Ученик (239) Лев Еров, тут во второй
Лев ЕровУченик (239) 6 месяцев назад
Все что я отредактировал:
 Rigidbody m_Rigidbody; 
public float speed = 5.0f;
public float cellSize = 1.0f;

bool isMoving = false;
Vector3 direction;
Vector3 destPos;
void Start() {
m_Rigidbody = GetComponent();
}

void Update()
{
if (isMoving == true)
{
float step = speed * Time.deltaTime;
m_Rigidbody.AddForce(5 * Time.deltaTime, ForceMode.VelocityChange);
m_Rigidbody.MovePosition(destPos);
if (transform.position == destPos) isMoving = false;
Лев ЕровУченик (239) 6 месяцев назад
Сделал понятнее
 Rigidbody m_Rigidbody; 
public float speed = 5.0f;
public float cellSize = 1.0f;

bool isMoving = false;
Vector3 direction;
Vector3 destPos;
void Start() {
m_Rigidbody = GetComponent();
}

void Update()
{
if (isMoving == true)
{
float step = speed * Time.deltaTime;
m_Rigidbody.AddForce(5 * Time.deltaTime, ForceMode.VelocityChange);
m_Rigidbody.MovePosition(destPos);
if (transform.position == destPos) isMoving = false;
Похожие вопросы