血条或进度条的效果
用Unity做血条或进度条真的很方便,GUI里scrollbar就可以轻松实现,再加上lerp一个血条或进度条就完成了。
using UnityEngine; using System.Collections; public class BloodBarTest : MonoBehaviour { public GUISkin theSkin; public float bloodValue = 0.0f; private float tmpValue; private Rect rctBloodBar; private Rect rctUpButton; private Rect rctDownButton; private bool onoff; // Use this for initialization void Start () { rctBloodBar = new Rect (20,20,20,200); rctUpButton = new Rect (50,20,40,20); rctDownButton = new Rect (50,50,40,20); tmpValue = bloodValue; } void OnGUI (){ GUI.skin = theSkin; if (GUI.Button (rctUpButton,"加血")){ tmpValue = -1.0f; } if (GUI.Button (rctDownButton,"减血")){ tmpValue += 0.1f; } if (bloodValue > 0.0f) tmpValue = 0.0f; if (bloodValue < -1.0f) tmpValue = -1.0f; bloodValue = Mathf.Lerp(bloodValue,tmpValue,0.05f); //~ Debug.Log (bloodValue + " " + tmpValue); GUI.VerticalScrollbar(rctBloodBar, 1.0f, bloodValue,0.0f, 1.0f,GUI.skin.GetStyle("verticalScrollbar")); } // Update is called once per frame void Update () { } }
Unity3D 音乐开关及音量控制 [转载]
在Component — Audio下创造一个Audio Source 附于一个GameObject上,加上音乐,
把playOnAwake勾去掉,然后将控制脚本附于它,再建一个GUI按钮来调用AudioSwitch()这个函数就OK了。
var myAudio; myAudio = GetComponent(AudioSource); private var scrollVol : float = 0.5; function AudioSwitch (){ if(!myAudio.playOnAwake) { myAudio.Play(); myAudio.playOnAwake=true; } else { myAudio.Stop(); myAudio.playOnAwake=false; } } function OnGUI() { if(myAudio.playOnAwake) { scrollVol = GUI.HorizontalSlider (Rect (150,175,100,20), scrollVol, 0.0, 1.0); myAudio.volume = scrollVol; } }
Unity3d Physics 类[转载]
Physics.RaycastAll
static function RaycastAll (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : RaycastHit[]
static function RaycastAll (origin : Vector3, direction : Vector3, distance : float = Mathf.Infinity, layermask : int = kDefaultRaycastLayers) : RaycastHit[]
函数描述
发射一条穿过整个场景的射线,返回他所有碰到的物体
参数理解:
ray : Ray 结构体,包含射线的源(origin : Vector3),和目标(direction : Vector3),即
用来表示射线投射点和方向
distance : float 浮点变量 射线长度
layerMask : int 层遮罩或深度,个人理解,这个参数决定射线能碰到物体的最大个数,很有用,大场景时,你不希望返回所有的物体吧,会增加系统开销
———————————–
static function Raycast (ray : Ray, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool
参数
名称 描述
ray 同上
distance 同上
layerMask 同上
返回
在射线范围内只要有 collider对象就返回true
———————————–
static function Raycast (ray : Ray, out hitInfo : RaycastHit, distance : float = Mathf.Infinity, layerMask : int = kDefaultRaycastLayers) : bool
参数
名字 描述
ray 同上
distance 同上
hitInfo rayhit 输出信息,这里指定一个 RaycastHit 变量 保存撞击信息
layerMask 同上
返回
撞击任何Collider对象返回true
———————————–
Physics.OverlapSphere
static function OverlapSphere (position : Vector3, radius : float, layerMask : int = kAllLayers) : Collider[]
参数
名字 描述
position 位置信息
radius 以‘位置信息’为中心,以radius为半径的的一个范围
layerMask 同上
描述
返回一个Collider类型数组,保存radius内,layerMask深度内的Collider对象
//被击中的collder变为半透明 var hits : RaycastHit[]; //定义一个RaycastHit数组 hits = Physics.RaycastAll (Camera.main.transform.position, Camera.main.transform.forward,50); //主相机的方向发射一条长50的射线,射线碰到的物体保存在数组hits中 Debug.DrawRay (Camera.main.transform.position, Camera.main.transform.forward *10, Color.green); //这个是调试中才看的到了,吧这条射线画出来 var hit : RaycastHit = hits[0]; //取碰到的第一个RaycastHit var renderer = hit.collider.renderer; if (renderer) { renderer.material.shader = Shader.Find("Transparent/Diffuse"); if (renderer.material.color.a !=0.3) { renderer.material.color.a = 0.3; } else { renderer.material.color.a = 1; } }