Пробую написать скрипт. Цель если кратко. Есть один или более ботов и игрок. Нужно настроить следование ботов к игроку и друг к другу. В случае когда они соприкоснутся должно произойти событие отталкивающие соприкоснувшихся в противоположные стороны.
Код на боте. Бот определяет по тегу где игрок(в идеале далее он должен искать просто близлежащую цель), поворачивается и идет к ней. Срабатывает кализия и цель как бы улетает(отталкивается) от него.
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%. Враг или улетает в даль(как? почему) или все же отлетает.
Возможно проблема в том что вы пытаетесь толкнуть бота вовсе не в противоположном направлении, я прямо в точку коллизии. Попробуйте rb.AddForce(-force*forceAmount);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Суть такова: я получаю объект типа A запросом через sessionCreateSQLQuery(query), после чего я создаю новый объект типа B, в котором ссылаюсь на мой свежеизвлеченный...
Есть несколько графиков и надо что бы они находились на одном plotВозможно ли это сделать? И как можно сделать в oxyplot сетку так же как в пример?...
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