Unity 2D, C # - Создание ИИ, который следует за игроком и развевается вокруг него. - PullRequest
0 голосов
/ 21 мая 2018

Прежде всего, я Крайне плохо знаком с программированием в целом, но я воспринял это как хобби, поэтому, пожалуйста, простите мое общее отсутствие понимания.

Я собираю платформер боковой прокрутки,в котором маленький персонаж сопровождает вас и дает вам советы, освещает путь, заполняет знания и т.д. Подумайте о Нави из Legend of Zelda.У меня уже есть работающий скрипт для слежения за игроком, который я опубликую ниже.

Однако я не могу заставить его лениво плавать вокруг персонажа, а не просто сидеть на месте.

public class WillOWispFollowPlayer : MonoBehaviour
{
public Transform target;

public float smoothSpeed = 0.05f;
public Vector3 offset;


private void FixedUpdate()
  {

    Vector3 desiredPosition = target.position + offset;
    Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
    transform.position = smoothedPosition;

  }
}

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Поработав некоторое время и посмотрев код других людей, я пришел к этому.Это добавляет две функции к исходному коду.Одним из них является функция случайного направления с регулируемым ускорением и замедлением, которая применяется в FixedUpdate.Другой - короткий всплеск скорости в отдельном случайном направлении.Эффект более трепетный, чем я изначально задумал, и меньше эффекта плавного блуждания, но он работает.Если у кого-то есть идеи сделать этот эффект менее нервным и более плавным, я открыт для предложений.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class WillOWispFollowPlayer : MonoBehaviour
{

public Transform target;

public float smoothSpeed = 0.05f;
public float smoothSpeedSlow = 0.02f;
public Vector3 offset;
public float hoverSpeed = 10000f;
public Rigidbody2D rb;
public static System.Timers.Timer hoverTimer;

public float acceleration;
public float deceleration;

private Rigidbody2D physics;
private Vector2 direction;

private void Start()
{
    rb = GetComponent<Rigidbody2D>();
    InvokeRepeating("HoverDirection", 0, 1); //calling the DoverDirection every second

    physics = GetComponent<Rigidbody2D>();
    physics.gravityScale = 0;
    physics.drag = deceleration;
}

private void FixedUpdate()
{
    Vector3 desiredPosition = target.position + offset;
    Vector3 smoothedPosition = Vector3.Lerp(transform.position, desiredPosition, smoothSpeed);
    Vector3 smoothedPositionSlow = Vector3.Lerp(transform.position, desiredPosition, smoothSpeedSlow);

    //setting up a "wander zone" where the Will'o'the'Wisp is less restricted within a defined distance of the player
    if (Vector3.Distance((target.position + offset), this.transform.position) >= .5)
    {
        transform.position = smoothedPosition;
    }
    else
    {
        transform.position = smoothedPositionSlow;
    }

    //Random direction generator This results in a "flutter" effect
    direction = UnityEngine.Random.insideUnitCircle;

    Vector2 directionalForce = direction * acceleration;
    physics.AddForce(directionalForce * Time.deltaTime, ForceMode2D.Impulse);
}

//A regular and prominant directional change, resulting in short darting motions around the target position
void HoverDirection() 
{
    rb.velocity = Random.onUnitSphere * hoverSpeed;
}
}
0 голосов
/ 21 мая 2018

Я не слишком углублялся в разработку игр, но я бы выбрал случайное местоположение с уклоном в сторону игрока или целевую позицию рядом с игроком.

Итак, скажем,что через равные интервалы вы генерируете новую случайную позицию или направление движения вашего спутника к, расстояние должно быть относительно близко к текущему местоположению спутника.Чтобы ваш спутник случайно не улетел, в закат , вы также должны убедиться, что это случайное местоположение или направление смещено в сторону местоположения игрока, например, чем дальше от игрока, тем большепредвзято будет двигаться к игроку.

...