【Unity】Unity场景中各物体之间的Update刷新方法的刷新次序

由于老大提出问题让我留意下刷新次序的问题....然后就有了这篇文章。

如果不想看过程的话,我就说下研究结果:

据我研究出来..  不同脚本的Update刷新次序,与脚本添加到场景的顺序有关。

有发现不同意见的小伙伴,希望提一下,毕竟我这个也不是用大量的数据和例子研究出来的。

 

先创建两个脚本(甚至可以一个....两个的话相对清晰一点)。

分别在其Update函数中输出消息(你能分辨清楚谁发出的就行了):

    
    void Update()
    {
        Debug.Log("SphereSend +" + gameObject.GetComponent<SphereSend>().);
    }

    void Update()
    {
        Debug.Log("cubeSend + " + gameObject.GetInstanceID()) ;

    }

此处Sphere 和 Cube 对应着同名的消息。

先创建Sphere对象,再创建Cube对象, 先给Sphere添加脚本,再给cube添加脚本

 Sphere与Cube场景顺序关系 如下:

输出信息顺序如下:(先输出的是Sphere的消息)

 

由上方例子猜想-刷新与处于场景顺序相关  (结果表示无关)

更换Sphere与Cube在场景中的顺序,如下:

消息输出结果:

 

猜想-刷新与物体在U3D内部ID相关  (结果表示无关)

先添加Cube再添加Sphere  先添加Sphere的脚本 再添加Cube的脚本

 

猜想-刷新与脚本添加顺序相关  (____目前结果显示_____相关)

先添加Cube再添加Sphere  先添加Cube的脚本 再添加Sphere的脚本

 

 

以上结果仅以上述例子数据测试得出,实际结果还是以各位自己测试的为准(如果发现我这结果有误,希望各位指出探讨,感谢)

纠结于此问题的同学可以自己多用些例子测试,甚至多拿几个数据进行测试分析。

### 创建和管理 Unity 中的歌单 在 Unity 中实现歌单功能可以通过多种方式完成,以下是基于音频播放器的核心逻辑以及如何管理和控制多个音频文件的方法。 #### 歌单数据结构设计 为了存储和管理多首歌曲的信息,可以定义一个 `Song` 类来保存每首歌曲的相关信息,例如歌曲名、艺术家、路径等。这些信息可以用列表形式存储以便于访问和操作[^1]: ```csharp [System.Serializable] public class Song { public string title; public string artist; public AudioClip audioClip; public Song(string _title, string _artist, AudioClip _audioClip) { title = _title; artist = _artist; audioClip = _audioClip; } } ``` 接着,在脚本中维护一个 `List<Song>` 来表示整个歌单的内容[^2]。 --- #### 音频源配置与初始化 通过 Unity 的 `AudioSource` 组件可以轻松处理音频播放需求。创建一个 GameObject 并附加 `AudioSource` 组件后,将其引用传递给自定义脚本以供后续调用[^3]。 ```csharp public class MusicPlayer : MonoBehaviour { public List<Song> playlist = new List<Song>(); private AudioSource audioSource; void Start() { audioSource = GetComponent<AudioSource>(); // 初始化示例歌单 playlist.Add(new Song("Track 1", "Artist A", Resources.Load<AudioClip>("Music/track_01"))); playlist.Add(new Song("Track 2", "Artist B", Resources.Load<AudioClip>("Music/track_02"))); } public void PlayNext() { int currentIndex = GetCurrentIndex(); int nextIndex = (currentIndex + 1) % playlist.Count; LoadAndPlay(nextIndex); } public void PlayPrevious() { int currentIndex = GetCurrentIndex(); int previousIndex = (currentIndex - 1 + playlist.Count) % playlist.Count; LoadAndPlay(previousIndex); } private void LoadAndPlay(int index) { if (index >= 0 && index < playlist.Count) { Song songToPlay = playlist[index]; audioSource.clip = songToPlay.audioClip; audioSource.Play(); Debug.Log($"Now playing: {songToPlay.title} by {songToPlay.artist}"); } } private int GetCurrentIndex() { for (int i = 0; i < playlist.Count; i++) { if (playlist[i].audioClip == audioSource.clip) { return i; } } return -1; } } ``` 上述代码实现了基本的上下曲切换逻辑,并支持循环播放模式[^4]。 --- #### 用户界面交互 为了让用户能够方便地控制播放状态(如暂停、继续),可以在 UI 上绑定相应的按钮点击事件。利用 Unity 提供的 Event System 和 Button 组件即可快速搭建基础控件面板[^5]。 ```csharp public void TogglePauseResume() { if (audioSource.isPlaying) { audioSource.Pause(); } else { audioSource.UnPause(); } } // 进度条更新方法 void UpdateProgressBar(float currentTime, float totalTime) { Slider progressBar = FindObjectOfType<Slider>(); // 假设场景中有滑动条对象 if (progressBar != null) { progressBar.value = currentTime / totalTime * 100f; } } ``` 此外还可以扩展更多特性比如显示当前正在播放哪一轨次序或者剩余时间等等细节部分。 --- #### 动态加载资源优化建议 当面对大量多媒体素材时,考虑采用异步加载机制减少内存占用压力;同时引入对象池技术进一步提升性能表现效率[^6]。 ```csharp IEnumerator LoadResourceAsync(string path) { ResourceRequest request = Resources.LoadAsync<AudioClip>(path); yield return request; AudioClip clip = (AudioClip)request.asset; Debug.Log("Loaded resource from:" + path); } ``` 以上就是关于如何构建简单版音乐播放系统的介绍内容啦! ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值