#c# #unity3d
#c# #unity3d
Вопрос:
Игра начинается, когда камера находится в этом положении :
Затем камера плавно медленно перемещается в это положение: используя этот скрипт :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Cinemachine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class PlayingInGameScenesController : MonoBehaviour
{
public GameObject camera;
public LockController lockController;
public GameObject uiTextsImage;
public float transitionSpeed = 5f;
public Transform currentView;
// The initial offset from the target.
private Vector3 offset;
private bool newGame = true;
private bool playingScene = true;
private Vector3 newPos;
private void Start()
{
currentView.position = new Vector3(43.4f, 1f,-6f);
offset = camera.transform.position - currentView.position;
}
public void PlayingSceneInGame()
{
PlayingSceneStatesControls(true);
StartCoroutine(ScenePlayingTime());
}
private void Update()
{
if (SceneManager.GetActiveScene().name != "Main Menu" amp;amp; newGame == true)
{
PlayingSceneInGame();
newGame = false;
}
}
private void LateUpdate()
{
if (playingScene == false)
{
//Lerp position
camera.transform.position = Vector3.Lerp(camera.transform.position, currentView.position, Time.deltaTime * transitionSpeed);
}
}
private void PlayingSceneStatesControls(bool LockState)
{
lockController.LockControl(LockState);
if (LockState == true)
{
uiTextsImage.SetActive(true);
}
else
{
uiTextsImage.SetActive(false);
playingScene = false;
}
}
IEnumerator ScenePlayingTime()
{
yield return new WaitForSeconds(10);
PlayingSceneStatesControls(false);
}
}
Теперь на этом этапе я хочу проверить и узнать, когда камера больше не движется в LateUpdate, а затем, когда камера перестала двигаться, чтобы включить true для сценария OrbitCam :
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class OrbitCam : MonoBehaviour
{
//All the variables used in this class(Look below to see what they do. :D )
private const float Y_ANGLE_MIN = 0.0f;
private const float Y_ANGLE_MAX = 50.0f;
private const float DISTANCE_MAX = 10.0f;
private const float DISTANCE_MIN = 0.1f;
private const float TRANS_MIN = 1.0f;
private const float TRANS_MAX = 2.0f;
public Transform lookAt;
public Transform camTransform;
public GameObject player;
private Camera cam;
public float distance = 5.0f;
private float currentX = 0.0f;
private float currentY = 0.0f;
private float sensitivityX = 4.0f;
private float sensitivityY = 1.0f;
private float trandis;
public Vector3 height = new Vector3(0, 0, 0);
private bool below = false;
private List<Renderer> playerRenderers = new List<Renderer>();
private void Start()
{
//Makes camTransform a transform. :)
camTransform = transform;
//Sets variable cam value to the main camera
cam = Camera.main;
foreach (Transform child in player.transform)
{
if (child.GetComponent<Renderer>() != null)
{
playerRenderers.Add(child.GetComponent<Renderer>());
}
}
}
private void Update()
{
//Makes the camera move by looking at the axis of the mouse(Also multiplied by the seisitivity.)
currentX = Input.GetAxis("Mouse X") * sensitivityX;
currentY = Input.GetAxis("Mouse Y") * sensitivityY;
//Limits the Y variable
currentY = Mathf.Clamp(currentY, Y_ANGLE_MIN, Y_ANGLE_MAX);
//Thiago Laranja's scrollwheel implemetation.
if (Input.GetAxis("Mouse ScrollWheel") > 0) { distance = 0.2f; }
if (Input.GetAxis("Mouse ScrollWheel") < 0) { distance -= 0.2f; }
//Makes sure that these variables never go over the max and be les than the min. :)
distance = Mathf.Clamp(distance, DISTANCE_MIN, DISTANCE_MAX);
trandis = Mathf.Clamp(distance, TRANS_MIN, TRANS_MAX) - 1;
for (int i = 0; i < playerRenderers.Count; i )
{
//Sets players transparency(Make sure that player materials rendering mode has set to transparent or other mode that supports transparency).
playerRenderers[i].material.color = new Color(playerRenderers[i].material.color.r, playerRenderers[i].material.color.g, playerRenderers[i].material.color.b, trandis);
//Disables the object from rendering if your're at distance 0.8.
if (distance <= 0.8f) { playerRenderers[i].enabled = false; }
if (distance > 0.8f) { playerRenderers[i].enabled = true; }
}
//If close enough to the character sinp into distance of 0.1(If distance is 0 the camera cant be rotated.)
if (distance <= 0.8f amp;amp; below == false) { distance = 0.1f; below = true; }
if (distance >= 0.8f amp;amp; below == true) { below = false; }
}
private void LateUpdate()
{
//Subtracts hte distance from Z coordinate
Vector3 dir = new Vector3(0, 0, -distance);
//Creates an quaternion for rotation(too bad that we cannot use Vector3. :D )
Quaternion rotation = Quaternion.Euler(currentY, currentX, 0);
//Sets the cameras position and makes it look at player.
camTransform.position = lookAt.position height rotation * dir;
camTransform.LookAt(lookAt.position height);
}
}
-
Я не знаю, как проверить, когда камера закончила / перестала перемещаться в целевое положение?
-
Когда я включаю OrbitCam на данный момент, я делаю это вручную, устанавливая флажок включить в редакторе, OrbitCam изменяет вид и положение камеры, и я хочу, чтобы при включении скрипта OrbitCam он сохранял вид и положение камеры на втором снимке экрана. Не сохранять этот вид и положение все время только для запуска игровой части. но что я получаю при включении скрипта OrbitCam, так это :
Ответ №1:
Я бы настоятельно рекомендовал использовать анимацию на камере. Это имеет большое преимущество в том, что вы можете изменять положение камеры, как вы делаете в скрипте, и у вас есть возможность устанавливать события анимации. Таким образом, вы можете вызвать функцию в конце анимации. Итак, если анимация камеры закончена, камера теперь находится в правильном положении, вы можете включить orbit cam. Его также очень просто настроить! Надеюсь, это поможет вам!
Комментарии:
1. Или использование расстояния Vector3 с пороговым значением тоже работает нормально. Моя главная проблема заключается в том, почему при включении скрипта orbitcam он меняет вид и положение камеры, а не продолжает с текущего положения и вида камеры.
2. Я действительно думаю, что вы не применяете свое предыдущее преобразование к камере. Я знаю, что вы устанавливаете объект cam на основную камеру, но внизу ближе к концу вы устанавливаете положение, не сохраняя предыдущее положение. Так что, возможно, вам нужно что-то вроде смещения для хранения информации о предыдущем положении камеры.