1、Resources 加载游戏资源
private GameObject bullet;
public GameObject bulletPos;
void update(){
if (Input.GetKeyDown(KeyCode.Space))
{
if(bullet == null)
{
bullet = Resources.Load<GameObject>("Prefabs/bullet");
}
GameObject go = Instantiate(bullet,bulletPos.transform.position,Quaternion.identity);
go.transform.rotation = bulletPos.transform.rotation;
}
}
2、OnGUI
public class OnGUIAPI : MonoBehaviour
{
string labelShow = "show";
bool toggle = false;
float slider = 0;
int selected = 0;
float value = 0;
private void OnGUI()
{
GUI.Label(new Rect(200, 200, 50, 50), labelShow);
//if(GUI.Button(new Rect(200, 250, 50,50), "btn"))
//{
// labelShow = "你点击了按钮";
//}
toggle = GUI.Toggle(new Rect(200, 250, 50, 50), toggle, "toggle");
if (toggle)
{
labelShow = "toggle为true";
}
else
{
labelShow = "show";
}
//垂直滑动条
slider = GUI.VerticalSlider(new Rect(200, 300, 50, 100), slider, 10, 0);
labelShow = slider.ToString();
//水平滑动条
slider = GUI.HorizontalSlider(new Rect(400, 300, 100, 50), slider, 0, 10);
labelShow = slider.ToString();
//工具栏
selected = GUI.Toolbar(new Rect(500, 300, 50, 50), selected, new string[] { "toolbar01", "toolbar02", "toolbar03" });
labelShow = selected.ToString();
//滚动条
value = GUI.VerticalScrollbar(new Rect(500, 100, 20, 100), value, 1, 10, 0);
labelShow = value.ToString();
}
}
血条
public class LifeBar : MonoBehaviour
{
public GameObject player;
string labelShow = "show";
private void OnGUI()
{
Vector3 pos = Camera.main.WorldToScreenPoint(player.transform.position);
labelShow = pos.ToString();
GUI.Label(new Rect(pos.x,Screen.height - pos.y, 100, 50), "血 条");
}
}
3、Time
*Time.time、Time.deltaTime受时间缩放影响
Time.time游戏开始到当前时间;Time.deltaTime游戏上一帧到当前帧的时间
Time.unscaledTime 真实时间,不接受时间缩放影响*
public class TimeTest : MonoBehaviour
{
float time = 0;
int isSelect = 0;
private void Update()
{
time += Time.deltaTime;
if(time >= 5)
{
Debug.Log("....");
time = 0;
}
}
private void OnGUI()
{
GUI.Label(new Rect(100, 100, 400, 50), "Time.time" + Time.time + "," + "Time.unscaledTime:" + Time.unscaledTime);
GUI.Label(new Rect(100, 200, 400, 50), "Time.deltaTime" + Time.deltaTime + "time:" + time);
GUI.Label(new Rect(100, 300, 400, 50), "Time.fixedTime" + Time.fixedTime+"," + "Time.fixedDeltaTime" + Time.fixedDeltaTime);
isSelect = GUI.Toolbar(new Rect(400, 200, 200, 100), isSelect,
new string[] { "TimeScale:0.05", "TimeScale:1.5", "TimeScale:1" });
switch (isSelect)
{
//Time.timeScale 时间缩放,小于 1 就是时间流逝变慢,大于 1 表示时间流逝变快
case 0:
Time.timeScale = 0.05f;
break;
case 1:
Time.timeScale = 1.5f;
break;
case 2:
Time.timeScale = 1;
break;
default:
break;
}
}
}
4、Mathf
1)、Lerp: 一直到接近 10 ----- lerpTest = Mathf.Lerp(lerpTest, 10, 0.1f);
2)、SmoothDamp 比较紧凑一些、比较细腻一些 、一直到接近 10 ----- dampTest = Mathf.SmoothDamp(dampTest, 10, ref speed, 1, 3);
3)、Clamp规范一些值的范围,小于最小值取最小值;大于最大值取最大值;正常在取值范围内,就取正常值。
public class MathfTest : MonoBehaviour
{
private int blood;
void Start()
{
//规范一些值的范围,小于最小值取最小值,大于最大值取最大值
//正常在取值范围内,就取正常值
//public static int Clamp(int value, int min, int max);
//public static float Clamp(float value, float min, float max);
blood = 120;
blood = Mathf.Clamp(blood, 0, 100);
Debug.Log(blood);//100
}
private float lerpTest = 0;
private float dampTest = 0;
float speed;
public GameObject cube;
private void Update()
{
匀速
//if(cube.transform.position.x < 10)
//{
// cube.transform.position += new Vector3(0.01f, 0, 0);
//}
//差值 a = Lerp(float a,float b,float t);
// (b - a) * t + a
/*
(10-0) * 0.1 + 0 = 1;
(10 - 1) * 0.1 + 1 = 1.9
......
*/
lerpTest = Mathf.Lerp(lerpTest, 10, 0.1f);
Debug.Log("lerpTest: " + lerpTest);
cube.transform.position = new Vector3(lerpTest, 0, 0);
/*
SmoothDamp比Lerp更细腻,作为修改摄像机跟随中的摄像机更细腻
*/
dampTest = Mathf.SmoothDamp(dampTest, 10, ref speed, 1, 3);
Debug.Log("dampTest: " + dampTest);
cube.transform.position = new Vector3(dampTest, 0, 0);
}
}
5、PlayerPrefs
*unity3d提供了一个用于本地持久化保存与读取的类--PlayerPrefs。
工作原理非常简单,以键值对的形式将数据保存在文件中,然后程序可以根据这个名称取出上次保存的数值。
Playerprefs常用静态方法:
SetFloat(),SetInt(),SetString()写入数据
GetFloat(),GetInt(),GetString()读取数据*
6、碰撞器 、 触发器
碰撞器:Box Collider (盒碰撞体),Mesh Collider (网格碰撞体)等
触发器:只需要在检视面板中的碰撞器组件中勾选 Is Trigger 属性选择框
碰撞检测:
*OnCollisionEnter(Collision collision) 当进入碰撞器
OnCollisionExit(Collision collision) 当退出碰撞器
OnCollisionStay(Collision collision) 当逗留碰撞器*
触发检测:
*OnTriggerEnter(Collider collider) 当进入触发器
OnTriggerExit(Collider collider) 当退出触发器
OnTriggerStay(Collider collider) 当逗留触发器*
碰撞器是触发器的载体,而触发器只是碰撞器身上的一个属性
*当Is Trigger=false时,碰撞器根据物理引擎引发碰撞,产生碰撞的效果,可以调用OnCollisionEnter/Stay/Exit函数;
当Is Trigger=true时,碰撞器被物理引擎所忽略,没有碰撞效果,可以调用OnTriggerEnter/Stay/Exit函数。
如果既要检测到物体的接触又不想让碰撞检测影响物体移动或要检测一个物件是否经过空间中的某个区域这时就可以用到触发器*
例子:
碰撞器:汽车被撞飞、皮球掉在地上又弹起效果
触发器:人站在靠近门的位置门自动打开效果
另外,collider的性能和效率大概的顺序是:Sphere Collider > Capsule > Box Collider > Mesh Collider.
碰撞器是另一种组件,它和刚体一起,来使碰撞发生。
如果两个刚体撞在一起,物理引擎将不会计算碰撞除非它们包含一个碰撞器组件。
没有碰撞器的刚体,会在物理模拟中相互穿透。碰撞器必须独立于刚体加在对象上。
碰撞器并不一定需要附加刚体,但是要使移动物体具有碰撞效果必须附加刚体。
为了使两个触发器碰撞时发出碰撞事件,其中一个必须包含刚体。