如何将游戏对象自动放置在镜头前?
How can I position a GameObject in front of camera automatic?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;
public class FadeScript : MonoBehaviour
{
public Camera camera;
public float fadeDuration = 5;
public bool alphaZero = false;
private Material material;
private float targetAlpha = 0;
private float lerpParam;
private float startAlpha = 1;
void Start()
{
Vector3 camFront = camera.transform.position + camera.transform.forward;
transform.position = camFront;
material = GetComponent<Renderer>().material;
SetMaterialAlpha(1);
}
void Update()
{
lerpParam += Time.deltaTime;
float alpha = Mathf.Lerp(startAlpha, targetAlpha, lerpParam / fadeDuration);
SetMaterialAlpha(alpha);
if (alpha == 0)
{
alphaZero = true;
}
}
public void FadeTo(float alpha, float duration)
{
startAlpha = material.color.a;
targetAlpha = alpha;
fadeDuration = duration;
lerpParam = 0;
}
private void SetMaterialAlpha(float alpha)
{
Color color = material.color;
color.a = alpha;
material.color = color;
}
}
我希望变换在镜头前。
所以我在开始时做了:
Vector3 camFront = camera.transform.position + camera.transform.forward;
transform.position = camFront;
在这种情况下,变换是一个平面。
脚本附在Plane上。
但结果是平面没有覆盖整个相机视图。
我想制作一个全黑的视图,然后它会淡出。
褪色工作正常但平面位置不正确:
底部是游戏视图 window,而游戏是 运行。这是褪色开始后的一点,您可以看到平面没有覆盖整个相机。右边有个space.
也许我也需要以某种方式改变平面大小和旋转?这个想法是将飞机自动定位在相机前面以使其全黑。
如果相机可以移动,您还需要设置与您的平面相同的方向
transform.rotation = camera.transform.rotation;
然后简单地让飞机变得非常大就可以了(使用比例参数)。
当然,如果需要的话,您也可以计算出确切的尺寸,但是对于透视相机来说,这并不是那么简单。
另一个解决方案,正如 m.rogalski 在对您的 post 的评论中所建议的那样,是使用 canvas 来填满屏幕:
在您的场景中创建一个空对象并向其添加 Canvas 组件。
在RenderMode中选择Screen Space - Overlay
在层次结构中的下方创建另一个游戏对象
在此游戏对象上,添加 Image 组件,放置黑色图像,或没有图像和黑色
在同一个组件上,将变换的锚点设置为从 0 到 1,并且没有位置偏移,以覆盖整个屏幕
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityStandardAssets.Characters.FirstPerson;
public class FadeScript : MonoBehaviour
{
public Camera camera;
public float fadeDuration = 5;
public bool alphaZero = false;
private Material material;
private float targetAlpha = 0;
private float lerpParam;
private float startAlpha = 1;
void Start()
{
Vector3 camFront = camera.transform.position + camera.transform.forward;
transform.position = camFront;
material = GetComponent<Renderer>().material;
SetMaterialAlpha(1);
}
void Update()
{
lerpParam += Time.deltaTime;
float alpha = Mathf.Lerp(startAlpha, targetAlpha, lerpParam / fadeDuration);
SetMaterialAlpha(alpha);
if (alpha == 0)
{
alphaZero = true;
}
}
public void FadeTo(float alpha, float duration)
{
startAlpha = material.color.a;
targetAlpha = alpha;
fadeDuration = duration;
lerpParam = 0;
}
private void SetMaterialAlpha(float alpha)
{
Color color = material.color;
color.a = alpha;
material.color = color;
}
}
我希望变换在镜头前。 所以我在开始时做了:
Vector3 camFront = camera.transform.position + camera.transform.forward;
transform.position = camFront;
在这种情况下,变换是一个平面。 脚本附在Plane上。
但结果是平面没有覆盖整个相机视图。 我想制作一个全黑的视图,然后它会淡出。 褪色工作正常但平面位置不正确:
底部是游戏视图 window,而游戏是 运行。这是褪色开始后的一点,您可以看到平面没有覆盖整个相机。右边有个space.
也许我也需要以某种方式改变平面大小和旋转?这个想法是将飞机自动定位在相机前面以使其全黑。
如果相机可以移动,您还需要设置与您的平面相同的方向
transform.rotation = camera.transform.rotation;
然后简单地让飞机变得非常大就可以了(使用比例参数)。 当然,如果需要的话,您也可以计算出确切的尺寸,但是对于透视相机来说,这并不是那么简单。
另一个解决方案,正如 m.rogalski 在对您的 post 的评论中所建议的那样,是使用 canvas 来填满屏幕:
在您的场景中创建一个空对象并向其添加 Canvas 组件。
在RenderMode中选择Screen Space - Overlay
在层次结构中的下方创建另一个游戏对象
在此游戏对象上,添加 Image 组件,放置黑色图像,或没有图像和黑色
在同一个组件上,将变换的锚点设置为从 0 到 1,并且没有位置偏移,以覆盖整个屏幕