大家好,今天小白给大家分享下我最近在使用高通3D音频插件基于unity开发3D音乐播放器过程中遇到的一些问题以及解决方式,欢迎一起交流学习。
一、如何给按钮组件动态切换贴图?
在制作音乐播放器的时候,需要在播放和暂停按键上添加不同的照片。一般情况下,播放器的播放和暂停是同一个按键(PlayOrPauseButton),该按键会动态的切换不同的贴图,因此我们会在一个按键上看到不同的形状,如下图,左边是暂停时放置的贴图(PausePicture),右边是播放时放置的贴图(PlayPicture)
|
首先在Start函数中注册按键监听函数:
playOrPauseButton.onClick.AddListener(PlayOrPauseAudio);
当有按键按下时,触发调用PlayOrPauseAudio函数,进入该函数后,首先根据isPlay这个标志来判断当前歌曲是否正在播放,当isPlay为真时,
playOrPauseButton.GetComponent<Image>().sprite = PausePicture; //歌曲播放时,若按下按键,则切换贴图为PausePicture。
audioSource.Pause() //暂停播放。
当isPlay为假时,
playOrPauseButton.GetComponent<Image>().sprite = PlayPicture; //歌曲未播放时,若按下按钮,则切换贴图为PlayPicture.
audioSource.Play(); //继续播放。
这就通过简单的两行代码就实现了按键贴图的动态转换。
二、如何方便快速地将GameObject对象摆放到合适位置?
在拖动组件的过程中,常常会出现组件不能出现在Game栏的情况,或者在Game栏呈现的布局不够美观,这个时候我们就应该考虑通过修改组件的transform栏中的坐标来调整组件位置。
这里补充了解一下Unity中使用的坐标系。(重点介绍世界坐标系)
世界坐标按照笛卡尔坐标系定义出来的绝对坐标系,各种其他坐标系都建立在世界坐标的基础上。我们知道二维平面内任意一个点可以用二维坐标(x,y)来表示,如果将这个概念延伸到三维空间内,那么三维空间内任意一个点都可以用三维坐标(x,y,z)来表示。这就是世界坐标的概念啦,坐标系通常可以分为左手坐标系和右手坐标系,而Unity3D采用的是左手坐标系。在Unity3D中我们可以使用transform.position来获取场景中一个物体的世界坐标,通常情况下编辑器中的Inspector窗口是以世界坐标来描述一个3D物体的位置的,除非当一个3D物体存在父物体的时候,它会以相对坐标来描述其位置。
了解了坐标系以后,我们就可以根据需要来通过修改组件的坐标点来将组件移动到合适的位置即可。
三、如何替换,旋转天空盒?
默认的天空盒的背景就是创建项目时看到的背景图,可以选择的天空盒种类也不多,但是我们可以自己制作天空盒或者在网上找其他漂亮的天空盒导入到自己的工程中,这时就可以选择不同的天空盒作为背景,虽然可以更换背景图,但背景图是静态的,看起来并不是很美观,那么有没有方法可以使得天空盒动起来呢?
1、首先了解一下什么是天空盒?
天空盒是一个全景视图,分为六个纹理,表示沿主轴(上,下,左,右,前,后)可见的六个方向。如果天空盒被正确地生成,那么纹理图片的边缘将会被无缝地合并,在里面的任何方向看,都会是一副连续的画面。全景图在场景中所有其他对象物体之后被渲染,并且旋转以匹配Camera的当前方向(它不会随着相机的位置而变化,相机的位置总是被视为在全景图的中心)。因此,使用天空盒一种是将现实感添加到场景的简单方法,并且图形硬件的负载最小。
2、如何选择设置不同的天空盒?
导航到Window --》Rendering ---》Lighting Settings ----》Environment ----》Skybox Material,,然后可以选择不同的天空盒即可。
3、如何使得天空盒旋转?
这里介绍两种方法:
第一种:(设置+代码)
a、把·mainCamera的clear flags设置成depth only 或者 don’t clear,maincamera的depth设置高于另一camera。
b、添加一个摄像头,命名为Skybox Camera,clear flags设为skybox,并且将culling mask 设为nothing。
c、这时候调整Skybox Camera的角度即可达到天空盒旋转的视觉效果。(代码调整摄像头角度即可。)
第二种:(以代码的形式控制)
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateSkyBox : MonoBehaviour
{
void Start()
{
}
void Update()
{
float num = RenderSettings.skybox.GetFloat("_Rotation");
RenderSettings.skybox.SetFloat("_Rotation", num + 0.05f);
}
}
将该脚本添加到主摄像头上以后,运行即可看到天空盒开始旋转起来了。
四、如何制作预制体?
在制作音乐播放器时,因为需要创建多个长方体组件,作为实现音频可视化的载体,组件的大小形状均相同,为了简化操作,了解了unity中的预制体。
1、什么是预制体?
预制体就是:组件的集合体 , 预制物体可以实例化成游戏对象。
2、预制体作用?
可以重复的创建具有相同结构的游戏对象。
3、简单的预制体制作?
在控制面板里创建一个模型,然后组合好想要的UI后,直接拖到“Assets” 目录下对应的文件夹下即可。
五、unity移动端触摸相关操作?
Unity的Input类中不仅包含桌面系统的各种输入功能,也包含了针对移动设备触屏操作的各种功能,下面介绍一下Input类在触碰操作上的使用。首先介绍一下Input.touches结构,这是一个触摸数组,每个记录代表着手指在屏幕上的触碰状态。每个手指触控都是通过Input.touches来描述的:
fingerId | 触摸的唯一索引 |
position | 触摸屏幕的位置 |
deltatime | 从最后状态到目前状态所经过的时间 |
tapCount | 点击数。Andorid设备不对点击计数,这个方法总是返回1 |
deltaPosition | 自最后一帧所改变的屏幕位置 |
phase | 相位,也即屏幕操作状态 |
phase(状态)有以下这几种:
Began | 手指刚刚触摸屏幕 |
Moved | 手指在屏幕上移动 |
Stationary | 手指触摸屏幕,但自最后一阵没有移动 |
Ended | 手指离开屏幕 |
Canceled | 系统取消触控跟踪,原因如把设备放在脸上或同时超过5个触摸点 |
比如要想实现单点触摸,可以添加在欲移动的组件上添加以上脚本:
using UnityEngine;
using System.Collections;
public class MoveSpeaker : MonoBehaviour {
Vector2 m_screenPos = new Vector2(); //记录手指触碰的位置
void Start()
{
//Input.multiTouchEnabled = true; //开启多点触碰
}
void Update()
{
if (Input.touchCount <= 0)
return;
if (Input.touchCount == 1) //单点触碰移动摄像机
{
if (Input.touches[0].phase == TouchPhase.Began)
{
m_screenPos = Input.touches[0].position; //记录手指刚触碰的位置
}
if (Input.touches[0].phase == TouchPhase.Moved) //手指在屏幕上移动,移动摄像机
{
transform.Translate(new Vector3( Input.touches[0].deltaPosition.x * 50 * Time.deltaTime, Input.touches[0].deltaPosition.y * 50 * Time.deltaTime, 0));
}
}
}
}
通过添加以上脚本,即可实现在移动端触摸以达到移动组件的目的。
七、总结
本篇主要简单记录了一些在制作3D音乐播放器过程中,遇到的一些小问题,整理下分享出来,欢迎一起交流学习。