协同程序工作不正常 - Unity [C#]
Coroutine is not working fine - Unity [C#]
我正在使用 Unity 跟踪一些图像目标 (ARCamera - Vuforia),一切正常。我在图像目标等上插入了一些 2D 精灵...但现在我不想在找到图像目标后立即显示所有目标,所以我去了 DefaultTrackableEventHandler.cs 并像这样实例化了我的自定义 class 示例 :
#region PRIVATE_MEMBER_VARIABLES
private TrackableBehaviour mTrackableBehaviour;
#endregion // PRIVATE_MEMBER_VARIABLES
public Example mainClass;
...
private void OnTrackingFound()
{
...
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
mainClass = new Example();
mainClass.OnTrackableFound(); // Public method on 'Example' Class
}
现在我的例子class:
public class 示例:MonoBehaviour {
public SpriteRenderer forYou;
public SpriteRenderer map;
public Example () {}
private bool isInTransition = false;
private float transition = 1;
private bool isShowing = false;
private float duration = 0;
void Start()
{
forYou = new SpriteRenderer();
map = new SpriteRenderer();
}
public void OnTrackableFound() {
StartCoroutine(FadeCoroutine());
}
private IEnumerator FadeCoroutine() {
yield return new WaitForSeconds(1);
Fade(true, .1f);
}
public void OnTrackableLost() {}
public void Fade (bool showing, float duration)
{
isShowing = showing;
isInTransition = true;
this.duration = duration;
transition = (isShowing) ? 0 : 1;
}
void Update ()
{
if (Input.GetMouseButtonDown (0)) {
Fade (true, .1f);
}
if (Input.GetMouseButtonUp (0)) {
Fade (false, .1f);
}
if (!isInTransition) {
return;
}
transition += (isShowing) ? Time.deltaTime * (1 / duration) : -Time.deltaTime * (1 / duration);
forYou.color = Color.Lerp (Color.white, new Color (1, 1, 1, 0), transition);
map.color = Color.Lerp (Color.white, new Color (1, 1, 1, 0), transition);
if (transition > 1 || transition < 0) {
isInTransition = false;
}
}
}
很抱歉代码量很大,但基本上这只是为了淡化 in/out 一些精灵。我想在 Example class 中调用我的 OnTrackingFound 后立即让步,并且在 idk .5 秒后我的一些精灵消失。
谢谢!
编辑 - 已解决
因此,要将脚本附加到游戏对象,它必须从 Monobehaviour 继承,但它不能被实例化,所以我所做的是:
我需要 DefaultTrackerHandler 中的 OnTrackingFound()...所以我在上面编写了所有代码 class [我知道这远非最佳解决方案但是...] 而不是实例化另一个脚本,因为正如我所说它不会可以将它附加到游戏对象,因为它不能从 Monobehaviour 继承。对于 public 游戏对象,我直接从这个 class 附加所有内容,它也继承自 Monobehvr。如果您实例化一个继承 monobehv 的脚本,它将为空。谢谢大家!
好像每次跟踪新目标时你都在调用mainClass = new Example();
。这将创建一个新对象 even-though 可能存在一个现有对象。我不相信你想要这个。
而是尝试调用 GameObject gobj = GameObject.Find()
(因为 GameObject 已经存在,对吗?)函数来获取脚本附加到的现有 GameObject。然后执行 gobj.GetComponent<Example>(). OnTrackableFound()
以调用 GameObject 上的事件。希望对您有所帮助。
我已经回答了 question 需要 gamedev 中这样的延迟。
基本上你会增加一个 float
值超时,当经过所需的时间量时,你会淡化精灵。
伪:
float counter;
bool isFadeReady = false;
void Update ()
{
if (OnTrackingFound)
{
isFadeReady = true;
}
if (isFadeReady == true)
{
counter +=0.1f; //change the value for increase speed
}
if(counter>=1.0f) //change the value for desired time
{
//Fade your sprite here
isFadeReady = false;
}
}
希望对您有所帮助!干杯!
您的代码的问题是您尝试实例化组件 Example
,该组件派生自 MonoBehaviour
使用 new
关键字调用构造函数。
永远不要这样做。
Unity3D 引擎中的所有组件都需要添加到现有 GameObject
和 GameObject.AddComponent<T>()
所以你需要做的是:
private void OnTrackingFound()
{
...
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
// create new GameObject and add component
mainClass = new GameObject("MyNewGameobject").AddComponent<Example>();
mainClass.OnTrackableFound(); // Public method on 'Example' Class
}
我正在使用 Unity 跟踪一些图像目标 (ARCamera - Vuforia),一切正常。我在图像目标等上插入了一些 2D 精灵...但现在我不想在找到图像目标后立即显示所有目标,所以我去了 DefaultTrackableEventHandler.cs 并像这样实例化了我的自定义 class 示例 :
#region PRIVATE_MEMBER_VARIABLES
private TrackableBehaviour mTrackableBehaviour;
#endregion // PRIVATE_MEMBER_VARIABLES
public Example mainClass;
...
private void OnTrackingFound()
{
...
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
mainClass = new Example();
mainClass.OnTrackableFound(); // Public method on 'Example' Class
}
现在我的例子class:
public class 示例:MonoBehaviour {
public SpriteRenderer forYou;
public SpriteRenderer map;
public Example () {}
private bool isInTransition = false;
private float transition = 1;
private bool isShowing = false;
private float duration = 0;
void Start()
{
forYou = new SpriteRenderer();
map = new SpriteRenderer();
}
public void OnTrackableFound() {
StartCoroutine(FadeCoroutine());
}
private IEnumerator FadeCoroutine() {
yield return new WaitForSeconds(1);
Fade(true, .1f);
}
public void OnTrackableLost() {}
public void Fade (bool showing, float duration)
{
isShowing = showing;
isInTransition = true;
this.duration = duration;
transition = (isShowing) ? 0 : 1;
}
void Update ()
{
if (Input.GetMouseButtonDown (0)) {
Fade (true, .1f);
}
if (Input.GetMouseButtonUp (0)) {
Fade (false, .1f);
}
if (!isInTransition) {
return;
}
transition += (isShowing) ? Time.deltaTime * (1 / duration) : -Time.deltaTime * (1 / duration);
forYou.color = Color.Lerp (Color.white, new Color (1, 1, 1, 0), transition);
map.color = Color.Lerp (Color.white, new Color (1, 1, 1, 0), transition);
if (transition > 1 || transition < 0) {
isInTransition = false;
}
}
} 很抱歉代码量很大,但基本上这只是为了淡化 in/out 一些精灵。我想在 Example class 中调用我的 OnTrackingFound 后立即让步,并且在 idk .5 秒后我的一些精灵消失。
谢谢!
编辑 - 已解决
因此,要将脚本附加到游戏对象,它必须从 Monobehaviour 继承,但它不能被实例化,所以我所做的是: 我需要 DefaultTrackerHandler 中的 OnTrackingFound()...所以我在上面编写了所有代码 class [我知道这远非最佳解决方案但是...] 而不是实例化另一个脚本,因为正如我所说它不会可以将它附加到游戏对象,因为它不能从 Monobehaviour 继承。对于 public 游戏对象,我直接从这个 class 附加所有内容,它也继承自 Monobehvr。如果您实例化一个继承 monobehv 的脚本,它将为空。谢谢大家!
好像每次跟踪新目标时你都在调用mainClass = new Example();
。这将创建一个新对象 even-though 可能存在一个现有对象。我不相信你想要这个。
而是尝试调用 GameObject gobj = GameObject.Find()
(因为 GameObject 已经存在,对吗?)函数来获取脚本附加到的现有 GameObject。然后执行 gobj.GetComponent<Example>(). OnTrackableFound()
以调用 GameObject 上的事件。希望对您有所帮助。
我已经回答了 question 需要 gamedev 中这样的延迟。
基本上你会增加一个 float
值超时,当经过所需的时间量时,你会淡化精灵。
伪:
float counter;
bool isFadeReady = false;
void Update ()
{
if (OnTrackingFound)
{
isFadeReady = true;
}
if (isFadeReady == true)
{
counter +=0.1f; //change the value for increase speed
}
if(counter>=1.0f) //change the value for desired time
{
//Fade your sprite here
isFadeReady = false;
}
}
希望对您有所帮助!干杯!
您的代码的问题是您尝试实例化组件 Example
,该组件派生自 MonoBehaviour
使用 new
关键字调用构造函数。
永远不要这样做。
Unity3D 引擎中的所有组件都需要添加到现有 GameObject
和 GameObject.AddComponent<T>()
所以你需要做的是:
private void OnTrackingFound()
{
...
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
// create new GameObject and add component
mainClass = new GameObject("MyNewGameobject").AddComponent<Example>();
mainClass.OnTrackableFound(); // Public method on 'Example' Class
}