goo*_*iag 4 c# 2d sprite unity-game-engine
我对编码很新,我仍然在努力发展思维逻辑,以帮助我创建我想要的游戏解决方案.目前,我正在Unity尝试创建一个2D GameObject,这是一个隐藏秘密门的墙.当玩家GameObject触发它时,我希望GameObject淡出(大约90%),露出后面的空间和隐藏的门.
到目前为止,我已经设法弄清楚如何在触发器上使"秘密墙"GO处于非活动状态,因此它会消失,但这并不会产生我想要的视觉效果.正如我所说,我仍在努力开发编码器的思维方式,所以虽然我已经做了很多研究来解决这个问题,但很多结果我都不太明白.
这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SecretDoor1 : MonoBehaviour {
void OnTriggerEnter2D (Collider2D SecretDoorTrig) {
if (SecretDoorTrig.gameObject.tag == "Player") {
GetComponent<SpriteRenderer> ().enabled = false;
}
else {
GetComponent<SpriteRenderer> ().enabled = true;
}
}
void OnTriggerExit2D (Collider2D SecretDoorTrig) {
if (SecretDoorTrig.gameObject.tag == "Player") {
GetComponent<SpriteRenderer> ().enabled = true;
}
else {
GetComponent<SpriteRenderer> ().enabled = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,淡化a Sprite与移动 GameObject 几乎相同,除了你修改它的alpha而不是它的位置.
关于褪色对象的三个最重要的东西是Time.deltaTime,Mathf.Lerp/Color.Lerp和协程.您需要了解这些如何协同工作.
启动协同程序,用于Time.deltaTime增加变量.该变量用于确定该函数的运行程度.在for/ whileloop中,使用每帧递增的变量以及希望淡入淡出的持续时间,以便在Mathf.Lerp函数的帮助下生成alpha .使用该alpha创建新颜色,并将其指定给Sprite.
这是在每一帧完成的,直到增加的变量 Time.deltaTime达到你希望淡入淡出的持续时间.
这是一个简单的SpriteRenderer淡入淡出功能:
public SpriteRenderer spriteToFade;
IEnumerator fadeOut(SpriteRenderer MyRenderer, float duration)
{
float counter = 0;
//Get current color
Color spriteColor = MyRenderer.material.color;
while (counter < duration)
{
counter += Time.deltaTime;
//Fade from 1 to 0
float alpha = Mathf.Lerp(1, 0, counter / duration);
Debug.Log(alpha);
//Change alpha only
MyRenderer.color = new Color(spriteColor.r, spriteColor.g, spriteColor.b, alpha);
//Wait for a frame
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想让它淡入,换Mathf.Lerp(1, 0, counter / duration);到Mathf.Lerp(0, 1, counter / duration);这将使得阿尔法从去0到1过的时间,而不是1到0.
从上面的示例中,编写淡出和淡入功能只需要一种方法来告诉函数将alpha更改1为0或从中0更改1.您可以使用函数boolean或enum变量来确定要执行的淡入淡出类型.当然,您可以将淡入/淡出功能分开,但最好将它放在一个功能中.
以下是该功能的扩展版本,支持淡入和淡出.它还支持几乎所有的游戏对象,如MeshRenderer(3D),SpriteRenderer(2D)Image,RawImage....你可以扩展它以支持更多缺少的组件.
IEnumerator fadeInAndOut(GameObject objectToFade, bool fadeIn, float duration)
{
float counter = 0f;
//Set Values depending on if fadeIn or fadeOut
float a, b;
if (fadeIn)
{
a = 0;
b = 1;
}
else
{
a = 1;
b = 0;
}
int mode = 0;
Color currentColor = Color.clear;
SpriteRenderer tempSPRenderer = objectToFade.GetComponent<SpriteRenderer>();
Image tempImage = objectToFade.GetComponent<Image>();
RawImage tempRawImage = objectToFade.GetComponent<RawImage>();
MeshRenderer tempRenderer = objectToFade.GetComponent<MeshRenderer>();
Text tempText = objectToFade.GetComponent<Text>();
//Check if this is a Sprite
if (tempSPRenderer != null)
{
currentColor = tempSPRenderer.color;
mode = 0;
}
//Check if Image
else if (tempImage != null)
{
currentColor = tempImage.color;
mode = 1;
}
//Check if RawImage
else if (tempRawImage != null)
{
currentColor = tempRawImage.color;
mode = 2;
}
//Check if Text
else if (tempText != null)
{
currentColor = tempText.color;
mode = 3;
}
//Check if 3D Object
else if (tempRenderer != null)
{
currentColor = tempRenderer.material.color;
mode = 4;
//ENABLE FADE Mode on the material if not done already
tempRenderer.material.SetFloat("_Mode", 2);
tempRenderer.material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
tempRenderer.material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
tempRenderer.material.SetInt("_ZWrite", 0);
tempRenderer.material.DisableKeyword("_ALPHATEST_ON");
tempRenderer.material.EnableKeyword("_ALPHABLEND_ON");
tempRenderer.material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
tempRenderer.material.renderQueue = 3000;
}
else
{
yield break;
}
while (counter < duration)
{
counter += Time.deltaTime;
float alpha = Mathf.Lerp(a, b, counter / duration);
switch (mode)
{
case 0:
tempSPRenderer.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 1:
tempImage.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 2:
tempRawImage.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 3:
tempText.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
case 4:
tempRenderer.material.color = new Color(currentColor.r, currentColor.g, currentColor.b, alpha);
break;
}
yield return null;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
GameObject褪色:
public GameObject SpriteRend;
Run Code Online (Sandbox Code Playgroud)
淡出3秒钟
StartCoroutine(fadeInAndOut(SpriteRend, false, 3f));
Run Code Online (Sandbox Code Playgroud)
淡入3秒
StartCoroutine(fadeInAndOut(SpriteRend, true, 3f));
Run Code Online (Sandbox Code Playgroud)
小智 1
我完成此操作的方法是更改精灵颜色的 Alpha。
颜色(R、G、B、A)。A 是阿尔法。
| 归档时间: |
|
| 查看次数: |
6223 次 |
| 最近记录: |