Unity3D С# Обработка столкновения и дальнейшего расталкивания между двумя объектами

106
04 ноября 2019, 09:30

Пробую написать скрипт. Цель если кратко. Есть один или более ботов и игрок. Нужно настроить следование ботов к игроку и друг к другу. В случае когда они соприкоснутся должно произойти событие отталкивающие соприкоснувшихся в противоположные стороны.

Код на боте. Бот определяет по тегу где игрок(в идеале далее он должен искать просто близлежащую цель), поворачивается и идет к ней. Срабатывает кализия и цель как бы улетает(отталкивается) от него.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnemyMovement : MonoBehaviour
{
    private Transform triggerPosition;
    public float enemySpeed = 10.0f;
    public float rotationSpeed = 10.0f;
    public float walkingDistance = 10.0f;
    public float smoothTime = 10.0f;
    private Vector3 smoothVelocity = Vector3.zero;
    public float forceAmount = 10.0f;
    private Rigidbody rb;
    void Start()
    {
        triggerPosition = GameObject.FindWithTag("Player").transform;
        rb = GetComponent<Rigidbody>();
    }

    // Update is called once per frame
    void FixedUpdate()
    {
        LookToTrigger();
        EnemyMove();
        Debug.Log("Player Position" + triggerPosition);
    }
    void LookToTrigger()
    {
        Quaternion targetRotation = Quaternion.LookRotation(triggerPosition.position - transform.position);
        transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);
    }
    void EnemyMove()
    {
        float distance = Vector3.Distance(transform.position, triggerPosition.position);
        if (distance < walkingDistance)
        {
            transform.position = Vector3.SmoothDamp(transform.position, triggerPosition.position, ref smoothVelocity, smoothTime);
        }
    }
    public void OnCollisionEnter(Collision other)
    {
        pushTo(other);
        other = null;
    }
    void pushTo(Collision c)
    {
        var force = transform.position - c.transform.position;
        if (c.gameObject.tag == "Player")
        {
            force.Normalize();
            rb.AddForce(force * forceAmount);
        }
    }
}

Код на игроке. Игрок следует за курсором мыши(находясь постоянно в движение) и в случае столкновения отбрасывает врага(в идеале должен и сам отлетать но это потом)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
    public float speed = 6f;
    // Start is called before the first frame update
    void Start()
    {
    }
    // Update is called once per frame
    void Update()
    {
        LookOnCursor();
    }
    void LookOnCursor()
    {
        Plane playerPlane = new Plane(Vector3.up, transform.position);
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        float hitdist = 0;
        if (playerPlane.Raycast(ray, out hitdist))
        {
            Vector3 targetPoint = ray.GetPoint(hitdist);
            Quaternion targetRotation = Quaternion.LookRotation(targetPoint - transform.position);
            transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, speed * Time.deltaTime);
        }
        transform.Translate(Vector3.forward * Time.deltaTime);
    }
}

Из того что есть на сцене. Пол это круг с Mesh collider. бот и игрок это объекты с capsule collider и rigidbody(вкл гравитация и ограничение ротации по x/z и позиции по y)

А теперь сама(и) проблема(ы). 1.OnCollisionEnter срабатывает только один раз(после этого Push не работает) 2.Отталкивает тоже в 50%. Враг или улетает в даль(как? почему) или все же отлетает.

Answer 1

Возможно проблема в том что вы пытаетесь толкнуть бота вовсе не в противоположном направлении, я прямо в точку коллизии. Попробуйте rb.AddForce(-force*forceAmount);

READ ALSO
NHibernate: ошибка при сохранении объекта в БД

NHibernate: ошибка при сохранении объекта в БД

Суть такова: я получаю объект типа A запросом через sessionCreateSQLQuery(query), после чего я создаю новый объект типа B, в котором ссылаюсь на мой свежеизвлеченный...

133
Как в oxyplot сделать несколько графиков

Как в oxyplot сделать несколько графиков

Есть несколько графиков и надо что бы они находились на одном plotВозможно ли это сделать? И как можно сделать в oxyplot сетку так же как в пример?...

96
Причина ошибки?

Причина ошибки?

Fatal error: Uncaught Error: Using $this when not in object context in H:\OSPanel\domains\KingKino\indexphp:13 Stack trace: #0 H:\OSPanel\domains\KingKino\index

109