我有一个来自Unity文档页面的示例程序,其中包含IEnumerator Start()如下所示,但我想知道如何void Start()在同一个脚本中也能正常运行?
我也尝试添加void Start()它,但它引发了一个错误.然后,我试着在一个IEnumerator函数中包含我的代码(它只是写入控制应用程序的数据路径),虽然通过使用0f延迟参数立即执行它,但它不会打印出任何东西......
我错过了什么?这种情况的常见解决方案是什么,你必须有一个IEnumerator Start()但你还需要执行启动代码?
/// Saves screenshots as PNG files.
public class PNGers : MonoBehaviour
{
// Take a shot immediately.
IEnumerator Start()
{
yield return UploadPNG();
yield return ConsoleMSG();
}
IEnumerator UploadPNG()
{
// We should only read the screen buffer after frame rendering is complete.
yield return new WaitForEndOfFrame();
// Create a texture the size of the screen, with RGB24 format.
int width …Run Code Online (Sandbox Code Playgroud) 我有一个MonoBehavior使用这些方法的源脚本:
private void Update () {
if (Input.GetMouseButton(0)) {
HandleInput();
}
}
private void HandleInput () {
Ray inputRay = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;
if (Physics.Raycast(inputRay, out hit)) {
var position = transform.InverseTransformPoint(hit.point);
Coordinates coords = Coordinates.FromPosition(position);
HexCell cell = null;
if (!cells.TryGetValue(coords, out cell)) {
var err = string.Format("{0} is an invalid position and coordinates are improperly calculated: {1}", position, coords);
print(err);
throw new System.ArgumentException(err);
}
print(string.Format("[{0}] cell: [{1}] {2}", DateTime.Now, cell.id, cell.coordinates));
OnCellTouched(cell);
}
}
Run Code Online (Sandbox Code Playgroud)
网格是透明的,我按预期得到六边形(单元格).在编辑器中,当我单击一个单元格时,我得到一条消息输出:
[05.31.2017.14.15.14.2836] …Run Code Online (Sandbox Code Playgroud) 首先,我需要停用一个游戏对象,然后在10秒后激活它,所以我认为协同程序是合适的:
IEnumerator BarDeactivate(float sec)
{
yield return new WaitForSeconds(sec);
var obj = GameObject.Find("OBJ");
obj.SetActive(false);
}
IEnumerator BarReactivate(float sec)
{
yield return new WaitForSeconds(sec);
var obj = transform.Find("OBJ");
obj.SetActive(true);
}
Run Code Online (Sandbox Code Playgroud)
显然,我不能再使用,GameObject.Find所以我用它transform.Find来找到不活跃的游戏对象,但当然.SetActive现在不行,因为obj实际上并不是游戏对象...
如何投射找到的变换,以便可以再次设置它?
我试过obj.gameObject.SetActive(true)但它一定是错的,因为这个物体不会复活......
我已经构建了一个小应用程序,我在某些对象中使用 OnMouseDrag 和 OnMouseDown。我认为这将是最好的选择,因为这种方法在 Update 方法之外。然而,在编译应用程序时,Unity 表示“游戏脚本或其他自定义代码包含 OnMouseXXX 事件处理程序。此类处理程序的存在可能会影响手持设备的性能。”
那么...我应该使用什么来代替 OnMouseDrag 和 OnMouseDown?
我已经看到我可以使用 Input.GetMouseButtonDown。但是要做到这一点,我必须向每个具有 OnMouseDown 的对象添加一个 Update 方法。是不是比拥有 OnMouseDrag 更糟糕?
而且,为什么 OnMouseXXX 事件对手持设备的性能不利?
我有一个变量,我需要在游戏运行时经常检查.为了简化这一点,检查是:if (score >= achievement1) {do something}.
把这个检查放在Update()每帧调用的函数中似乎有点过分了.
所以相反,我在InvokeRepeating函数中调用Start ();函数:
InvokeRepeating ("checkscoreforachievement", 0f, 2f);
Run Code Online (Sandbox Code Playgroud)
这样聪明还是有更好的方法呢?最终结果应该是在达到一定分数后的几秒钟内,触发成就.
我问的原因是,当我的游戏运行时,我还需要做更多的事情,所以我最终会选择其中的一些进程.想知道这是不是太多的资源消耗.找不到关于这个主题的好文档.
我想在 AR 相机中播放视频。我总共有 10 个视频和一个视频播放器。我正在从服务器下载视频播放器作为资产包,名称为 videoplayer.unit3d 并存储到 SD 卡中。当我扫描 imageTarget 时,我正在使用AssetBundle.LoadFromFile()函数读取视频资产包文件,并且第一次它工作正常。
如果我扫描第二个 imageTarget 它会显示以下错误
“无法加载,因为已经加载了另一个具有相同文件的 AssetBundle”
我试过 a bundle.Unload(true);andCaching.cleanchache()但它不工作抛出同样的错误。也试过bundle.Unload(false);
private void loadObject(string resourcePath, string objectName, TrackableBehaviour trackableBehaviuor, string videoUrl)
{
Debug.Log("Resource path " + resourcePath + " objectName " + objectName);
Debug.Log("Video Url from sd card " + videoUrl);
FileInfo fileInfo = new FileInfo(resourcePath);
if (!fileInfo.Exists)
return;
Debug.Log("File is present");
AssetBundle bundle = AssetBundle.LoadFromFile(resourcePath, 0, 0);//www.assetBundle;
Debug.Log("Bundle data is " + bundle);
if (bundle …Run Code Online (Sandbox Code Playgroud)我如何根据统一检查器中的其他变量值隐藏变量。基本上想象一下:如果我有一个名为“CanSprint”的布尔值和一个名为“SprintSpeed”的浮点数,那么我想这样做,以便当布尔值为真时,浮点数显示,但当布尔值为假时,浮点数隐藏。这只是为了更整洁一点。谢谢!
我正在 Unity 中编写一个简单的代码,以检查我是否能够通过我的应用程序访问网站。这是我写的代码:
IEnumerator CheckInternetPing()
{
WWW wwwInternet = new WWW("http://google.com");
yield return wwwInternet;
if (wwwInternet.bytesDownloaded == 0)
{
//yield return new WaitForSeconds(1f);
Debug.Log("Not Connected to Internet");
}
else
{
Debug.Log("Connected to Internet");
internetMenu.SetActive(false);
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了一个错误,如果我在互联网上运行它,它会显示“已连接”,但是当我关闭互联网并立即运行该应用程序时,它不会记录任何内容。仅当我再次重新启动应用程序时,它才会显示“未连接”。有谁知道为什么它在第一次没有记录任何内容?谢谢
有一篇关于将 OpenCV 转换为Unity的帖子,我提供了一个效果很好的答案。现在,我正试图做相反的事情,但现在已经坚持了几个小时。cv::MatTexture2D
我想将 Unity 转换Texture2D为 OpenCV,cv::Mat以便我可以在 C++ 端处理纹理。
这是Texture2D我要转换为 Unity 项目中的原始文件cv:Mat:
这是转换成后的样子cv:Mat:
它看起来很褪色。我不担心图像的旋转。我可以解决这个问题。只是想知道为什么它看起来如此褪色。也用于cv::imwrite保存图像以进行测试,但问题也出现在保存的图像中。
C# 代码:
[DllImport("TextureConverter")]
private static extern float TextureToCVMat(IntPtr texData, int width, int height);
unsafe void TextureToCVMat(Texture2D texData)
{
Color32[] texDataColor = texData.GetPixels32();
//Pin Memory
fixed (Color32* p = texDataColor)
{
TextureToCVMat((IntPtr)p, texData.width, texData.height);
}
}
public Texture2D tex;
void Start()
{
TextureToCVMat(tex);
}
Run Code Online (Sandbox Code Playgroud)
C++ 代码:
DLLExport …Run Code Online (Sandbox Code Playgroud) 我对内存和优化比较陌生。我的任务是优化一个现有项目,在查看 Unity 中的分析器时,我发现有一个函数会生成一堆东西供 GC 清理。
该函数是这样的:
public bool AnyCanvasOpen()
{
for (int i = 0; i < canvasList.Count; i++)
if (canvasList[i].activeSelf && canvasList[i].name != "MainUICanvas")
return true;
return false;
}
Run Code Online (Sandbox Code Playgroud)
其中 canvasList 只是游戏对象的列表。我的 282B 分配可能是什么原因?
c# ×10
android ×1
arrays ×1
assetbundle ×1
c++ ×1
httprequest ×1
input ×1
inspector ×1
memory ×1
opencv ×1
performance ×1
string ×1