Tag: unity3d

为什么MonoBehaviour方法没有实现覆盖?

在Unity3d您拥有MonoBehaviour类,它是所有脚本的普通基类。 在实现脚本时,必须实现诸如Awake()或Start()或Update() 。 但是,这些方法在MonoBehaviour类中没有实现为virtual或abstract ,因此可以轻松override它们; 实际上它们根本没有实现。 在Moment写的方法是一个新的方法,该类没有事先。 为什么这些方法在基类( MonoBehaviour )中没有实现为virtual或abstract ?

Unity从资源加载文本

我可以使用以下内容更改UILabel (命名为about)的文本: using UnityEngine; using System.Collections; public class about : MonoBehaviour { void Start () { UILabel lbl = GetComponent(); lbl.text = “Hello World!”; } } 但是,当我想从资源( Assets/Resources/about.txt )中的文本文件加载标签文本时出现问题。 lbl.text = Resources.Load(Application.dataPath + “/Resources/about”) as String 所以我不确定我哪里出错了,是的,我看过这里 。

Unity如何执行其方法?

我在Unity3D中只有很少的经验,但我注意到从MonoBehaviour派生的类可能包含具有预定义签名的函数,这些函数将以特殊方式调用。 例如,如果我写: void Update() { //some code } 每个帧都会调用此方法。 我想在Unity内部有一种无限循环,它为场景中每个对象的每一帧调用Update方法。 但是它如何知道该对象实际上提供了Update方法实现呢? 很明显,如果Update是MonoBehaviour类中方法的覆盖,但是通过语法(以及您可以使用任何访问修饰符实现此类方法的事实)判断它不是。 那里有一些反思魔法吗?

Unity中的LoadScene()函数何时更改场景?

当您调用函数LoadScene()时,它会立即切换场景,还是只是发出需要更改场景的信号? LoadScene()的文档没有说明。 我正在使用的具体示例如下所示: LoadScene(levelName); ItemBox newBox = (ItemBox)Instantiate(…); 因此,使用上面的代码,newBox是否存在于我们刚刚加载的场景中,或者它是否会在旧场景中创建,然后在加载新级别时被销毁。

我可以在mac上编程c#吗?

我只是好奇。我想学习c#团结。 我是宿舍学生,我的个人电脑是macbook air,我们有一个公共电脑室。 我只是想问我是否可以在mac上使用c#。

AudioClip的频率和音高关系 – Unity3D

我试图仅使用6个音频剪辑重新创建全系列的吉他。 我想有一种设置音频剪辑频率的方法,但audio.frequency只返回基于压缩格式而不是实际音调的音频频率。 我知道我可以阅读GetSpectrumData,但是这个解决方案相当复杂,需要进行一些傅里叶变换分析或类似的东西。 影响音高,很容易改变音调,所以我可以上下,但是有办法弄清楚使用的步骤是什么。 void Update () { CheckAudio(KeyCode.Q, 1.0f); CheckAudio(KeyCode.W, 1.1f); CheckAudio(KeyCode.E, 1.2f); CheckAudio(KeyCode.R, 1.3f); CheckAudio(KeyCode.T, 1.4f); } void CheckAudio(KeyCode key, float pitch) { if (Input.GetKeyDown (key)) { audio.pitch = pitch; audio.Play (); } } 我听说听起来不对劲。 知道初始音调E4 329.63Hz,音高为1是否有任何影响音高的方程式,我会得到下一个键F4 349.23Hz(或足够接近)? 还必须考虑Unity AudioSource将音调限制在-3/3范围内(我认为这超出了需要)。 编辑:添加一些个人研究。 似乎音高1是初始音符,设置为2给出相同的音高一个八度。 由于半音阶(钢琴上的所有黑白音符)都是12个键,我假设每步使用1/12应该这样做。 听起来很接近,但我觉得它不太对劲。 这是新代码: [SerializeField] private AudioSource audio; float step = 1f/12f; […]

如何将枚举数作为常量?

根据枚举中定义的项目总数 ,我看到我可以使用以下命令获取枚举数: Enum.GetNames(typeof(Item.Type)).Length; 效果很好! 但是,我需要将此数字作为常数,以便我可以在Unity的[Range(int, int)]function中使用它。 private const int constEnumCount = Enum.GetNames(typeof(Item.Type)).Length; 以上不起作用,因为枚举计数不是常数,所以我不能将它分配给常量变量。 如何将枚举数作为常量?

在unity3d中按标签查找不活动的gameobject

我有一个游戏对象,我想在一定条件下激活它。 我给它一个唯一的标签,我尝试使用GameObject.FindObjectWithTag(“Tag name”). 据我所知,这种方法只能在场景中找到活动的游戏对象而不是非活动的游戏对象。 有没有一种我可以调用的方法,它也可以搜索不活跃的游戏对象? (最好用标签搜索)。 谢谢!

Unity Networking-UNet中的加法场景加载

简短说明:我正在我的主场景中加载一个添加场景 ,它的加载很好但是添加场景的GameObject(包含网络标识组件)正在变得禁用 。 详细信息:我正在通过此代码加载一个附加场景,以便添加一个场景加载到我的服务器和所有工作正常的客户端: [ClientRpc] public void RpcLoadLevelAcrossNetwork() { SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive); } 虽然它已将我的场景加载到客户端/服务器但是具有网络标识的对象被禁用(这是默认行为,因为我检查了Unity UNetSceneObjects ,其中声明: 加载场景时,将禁用场景中具有NetworkIdentity组件的所有对象; 在客户端和服务器上。 然后, 当场景完全加载时,将调用NetworkServer.SpawnObjects()来激活这些联网的场景对象。 这将在服务器场景完成加载时由NetworkManager自动完成 – 或者可以由用户代码直接调用。 作为文档声明它将自动激活网络标识对象,但它不会在我的上下文中发生。 我的场景加载很好,但其网络标识对象不活动。 我做错了什么? 我还试图通过在我新加载的场景中调用NetworkServer.SpawnObjects()来激活我自己的对象,但它只在服务器端生成对象,同时在客户端显示错误 未找到1个Spawn场景对象的Spawn场景对象找不到2个未找到的Spawn场景对象….. ….. 。 。 任何Unet冠军可以帮助我吗? 编辑/更新方法: 我已经根据添加场景加载的统一论坛讨论更改了我的代码,它在服务器上加载我的附加场景有错误(如下所示),仍然我的客户端的场景网络标识对象被禁用: 错误: 使用无效连接对象调用Ready():conn = null 另一个代码尝试: #region AdditiveSceneLoadingSetup [Command]//calling this for additive scene load- its start public void CmdLoadAdditiveSceneMainCall() { RpcLoadAdditiveScene(); StartCoroutine(LoadAdditiveSceneAtServer()); } […]

设置Array的Length属性

是否可以使用某种技术更改数组的Length属性? 我需要将数组的前x个成员传递给方法。 项目要求阻止我分配任何堆分配,因此我不能使用任何Array.Resize()或创建新数组。 此外, 我无法更改SetVertices代码,因为它属于另一个库。 它需要V[] 。 我无法将IList或V*传递给它。 public void BuildIt(V[] verts,int x){ verts.Length = x; //Compile error mesh.SetVertices(verts); } 当然代码不会编译。 我需要一些像reflection或扩展方法这样的技术来将数组伪装成更小而不实际创建更小的数组。 我希望SetVertices()方法认为数组有x个成员,即使它有更多。 编辑: 测试了以下方法,它们不起作用: stackalloc不起作用,因为它不会创建(或者我无法获得)真正的数组。 窥视单项目我发现数组的Length属性调用GetLenght()和GetRank()方法来确定长度。 抛开一个不好的做法,我不能用扩展方法覆盖这个方法,因为实例方法优先于扩展方法(或者有没有办法强制使用?)。 接下来会尝试代码注入。 EDIT2: 试图将代码发送到Array.GetLength()和Array.Length 。 似乎没有简单,可靠,跨平台和干净的方法来在运行时更改现有的方法体。