在 Unity3D 上使用精灵时的 2 个问题
2 problems when working with sprites on Unity3D
我需要将面朝下卡片的精灵替换为另一张(正面朝上的卡片)精灵。
这是面朝下卡片附带的 C# 脚本:
using UnityEngine;
using System.Collections;
public class Entra : MonoBehaviour
{
public float velocidadDeRotacion = 100.0f;
public Sprite CartaBase;
public Sprite CartaDelantera;
private bool clickActivado = false;
public void OnMouseDown()
{
clickActivado = true;
}
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if (clickActivado)
{
transform.Rotate(Vector3.up * Time.deltaTime * velocidadDeRotacion);
if (transform.eulerAngles.y >= 90)
{
SpriteRenderer Carta;
Carta = GetComponent<SpriteRenderer>();
if (Carta.sprite == CartaBase)
{
Carta.sprite = CartaDelantera;
transform.Rotate(Vector3.up * Time.deltaTime * velocidadDeRotacion);
if (transform.eulerAngles.y >= 0 && transform.eulerAngles.y <=10)
{
transform.eulerAngles = new Vector3(0, 0, 0);
clickActivado = false;
return;
}
}
clickActivado = false;
return;
}
}
}
}
如你所见,我在点击卡片时旋转卡片,当角度达到 90º 时我停止旋转并更改精灵,从 CartaBase 到 CartaDelantera。
现在我有两个问题。
- 当 sprite 的角度为 1º 或更大时,图像会中断。我输了
图像的右半部分从中心到右边界,以及
我不明白为什么。
- 使用 VS2013 作为调试器,我一步一步地演练,什么时候
它达到
if (Carta.sprite == CartaBase)
它直接跳到
clickActivado = false;
所以,显然它不是"seeing"卡片使用的精灵。为什么???
我正在使用 this 脚本作为精灵更改的参考。
我解决了第二个问题。它一直在我面前。
正如我所说,我使用这段代码作为示例。这个很棒的答案没有向你解释的是,一旦你编译了代码,如果你 select 精灵回到层次结构,你会注意到有两个变量可用,对应于你在代码中声明的变量。
我的大错误是没有理解下面的内容,在示例中@Savlon 说:“// 将你的第一个精灵拖到这里”,我按字面意思理解为 "drag your sprite to the VS"。是的,我知道,我是个大笨蛋,请不要说...
我需要做的是将 sprite 拖到 THE Inspector,再回到 Unity3D 上。更具体地说,是精灵上可用的新变量。
我还解决了第一个问题,方法是将 Z 轴上的相机设置为与精灵宽度一样多的单位。问题是相机离精灵太近了,所以当精灵转动时它在相机后面,因此精灵的那部分没有被渲染。 @Nosekills 的最初建议为我指明了正确的方向。
感谢@Nosekill 和@hexagonius 提供的帮助。
我需要将面朝下卡片的精灵替换为另一张(正面朝上的卡片)精灵。
这是面朝下卡片附带的 C# 脚本:
using UnityEngine;
using System.Collections;
public class Entra : MonoBehaviour
{
public float velocidadDeRotacion = 100.0f;
public Sprite CartaBase;
public Sprite CartaDelantera;
private bool clickActivado = false;
public void OnMouseDown()
{
clickActivado = true;
}
// Use this for initialization
void Start ()
{
}
// Update is called once per frame
void Update ()
{
if (clickActivado)
{
transform.Rotate(Vector3.up * Time.deltaTime * velocidadDeRotacion);
if (transform.eulerAngles.y >= 90)
{
SpriteRenderer Carta;
Carta = GetComponent<SpriteRenderer>();
if (Carta.sprite == CartaBase)
{
Carta.sprite = CartaDelantera;
transform.Rotate(Vector3.up * Time.deltaTime * velocidadDeRotacion);
if (transform.eulerAngles.y >= 0 && transform.eulerAngles.y <=10)
{
transform.eulerAngles = new Vector3(0, 0, 0);
clickActivado = false;
return;
}
}
clickActivado = false;
return;
}
}
}
}
如你所见,我在点击卡片时旋转卡片,当角度达到 90º 时我停止旋转并更改精灵,从 CartaBase 到 CartaDelantera。
现在我有两个问题。
- 当 sprite 的角度为 1º 或更大时,图像会中断。我输了 图像的右半部分从中心到右边界,以及 我不明白为什么。
- 使用 VS2013 作为调试器,我一步一步地演练,什么时候 它达到
if (Carta.sprite == CartaBase)
它直接跳到
clickActivado = false;
所以,显然它不是"seeing"卡片使用的精灵。为什么???
我正在使用 this 脚本作为精灵更改的参考。
我解决了第二个问题。它一直在我面前。
正如我所说,我使用这段代码作为示例。这个很棒的答案没有向你解释的是,一旦你编译了代码,如果你 select 精灵回到层次结构,你会注意到有两个变量可用,对应于你在代码中声明的变量。
我的大错误是没有理解下面的内容,在示例中@Savlon 说:“// 将你的第一个精灵拖到这里”,我按字面意思理解为 "drag your sprite to the VS"。是的,我知道,我是个大笨蛋,请不要说...
我需要做的是将 sprite 拖到 THE Inspector,再回到 Unity3D 上。更具体地说,是精灵上可用的新变量。
我还解决了第一个问题,方法是将 Z 轴上的相机设置为与精灵宽度一样多的单位。问题是相机离精灵太近了,所以当精灵转动时它在相机后面,因此精灵的那部分没有被渲染。 @Nosekills 的最初建议为我指明了正确的方向。
感谢@Nosekill 和@hexagonius 提供的帮助。