Как я могу случайно повернуть объект от оси y в двух направлениях? - PullRequest
1 голос
/ 21 июня 2019

Я хочу создать эффект, как объект смотрит вокруг.Как будто это осматривает вокруг.В этом он смотрит в окно, так что идея состоит в том, чтобы сделать так, как будто он смотрит снаружи.

Это скриншот Navi, смотрящего в окно: камера расположена из окна и смотрит впередна лице Navi:

Navi is looking at the window the view outside

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

public class ItemAction : MonoBehaviour
{
    public float xAngle, yAngle, zAngle;
    public float speed;
    public camMouseLook mouselook;
    public GameObject lockedRoomCamera;
    public Camera playerCamera;
    public GameObject navi;
    private bool torotate = false;

    public void Init()
    {
        navi.transform.parent = null;
        navi.transform.localScale = new Vector3(0.5f, 0.5f, 0.5f);
        navi.transform.Rotate(new Vector3(0, 180, 0));
        PlayerController.disablePlayerController = true;
        mouselook.enabled = false;
        playerCamera.enabled = false;
        lockedRoomCamera.SetActive(true);
        torotate = true;

    }

    private void Update()
    {
        if(torotate == true)
        {
            navi.transform.Rotate(xAngle, Random.Range(90, 270) * speed * Time.deltaTime, zAngle, Space.Self);
        }
    }
}

Я хочу повернуть объект только по оси Y в случайном порядке между 90 и 270 градусами.Таким образом, он будет выглядеть так, как будто объект смотрит в стороны влево и вправо.

Но теперь объект просто безостановочно вращается в одном направлении влево.

1 Ответ

1 голос
/ 21 июня 2019

Одним из способов является использование сопрограммы для генерации случайных вращений так часто, а затем переход к ним со временем:

IEnumerator DoLookAround() 
{
    float lookPeriod = 5f; // change look every 5 seconds
    float maxRotationSpeed = 90f; // turn no faster than 90 degrees per second
    Vector3 neutralForward = transform.forward;

    while(true) 
    {
        float timeToNextLook = lookPeriod;

        while (timeToNextLook > 0) {
            // Get random offset from forward
            float targetYRotation = Random.Range(-90f, 90f);

            // calculate target rotation
            Quaternion targetRotation = Quaternion.LookRotation(neutralForward, transform.up) 
                                       * Quaternion.AngleAxis(targetYRotation, Vector3.up);

            // rotate towards target limited by speed
            Quaternion newRotation = Quaternion.RotateTowards(transform.rotation, targetRotation, maxRotationSpeed * Time.deltaTime);


            timeToNextLook -= Time.deltaTime;
            yield return null;
        }
    }
}

Затем вы можете вызвать его с помощью:

StartCoroutine("DoLookAround");

и останови это с

StopCoroutine("DoLookAround");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...