目录
(四)Unity函数的生命周期
(五)游戏组件获取与控制
(六)Time类
(七)Mathf类
(八)PlayerPrefs
(九)碰撞检测
首先先获取到该游戏物体,再通过GetComponent
gameObject.GetComponent
();
这个地方要注意避免空引用问题,所以在执行相关代码前,要增加一个if判断,如果获取的不为空蔡执行相关代码。
gameObject.AddComponent
();
删除组件
Destroy(某component);
组件失活/激活
某component.enabled = false; 某component.enabled = true ;
资源加载
GameObject obj=Resources.Load
("Prefab/Tank") ;//这是将硬盘资源加载到内存中的一种方法,可以代替拖拽预制体到脚本的方法,前面加载个if判断可以避免重复执行提高效率。 Instantiate(obj);//在场景中实例化。
扩展学习:血条制作
public float xOffset;
public float yOffset;
public RectTransform recTransform;
void Update()
{
Vector2 player2DPosition = Camera.main.WorldToScreenPoint(transform.position);//将玩家世界坐标转换成屏幕坐标
recTransform.position = player2DPosition + new Vector2(xOffset, yOffset);//屏幕坐标加上偏移就得到UI坐标
//血条超出屏幕就不显示
if (player2DPosition.x > Screen.width || player2DPosition.x < 0 || player2DPosition.y > Screen.height || player2DPosition.y < 0)
{
recTransform.gameObject.SetActive(false);
}
else
{
recTransform.gameObject.SetActive(true);
}
}
public Text timeText1;
public Text timeText2;
public Text timeText3;
void Update()
{
timeText1.text = "Time.time:"+Time.time;//游戏场景开始至目前的时间,会受到timeScale的影响
timeText2.text = "Time.deltaTime:" + Time.deltaTime;//两帧之间的时间间隔,会随着游戏复杂变大,也会受到time=Scale的影响。
timeText3.text = "Time.unscaleTime" + Time.unscaledTime;//游戏场景开始至目前的时间,不会受到timeScale的影响
if(Input.GetKeyDown(KeyCode.Z))
if(Input.GetKeyDown(KeyCode.Z))
{
Time.timeScale = 0.1f;
}
if(Input.GetKeyDown(KeyCode.X))
{
Time.timeScale = 1f;
}
if(Input.GetKeyDown(KeyCode.C))
{
Time.timeScale = 0f;
}
}
Mathf.Clamp
public int blood;
void Start()
{
/*Mathf.Clamp()用来规范一些值得取值范围,只能在范围内取值,超出范围取阈值*/
blood = 20;
blood = Mathf.Clamp(blood, 0, 100);
Debug.Log("blood:"+blood);//结果显示20;
blood = 103;
blood = Mathf.Clamp(blood, 0, 100);
Debug.Log("blood:" + blood);//结果显示100;
blood = -10;
blood = Mathf.Clamp(blood, 0, 100);
Debug.Log("blood:" + blood);//结果显示0;
}
Mathf.Lerp / Mathf.SmoothDamp
float lerpTest;
float dampTest;
float speed;
void Update()
{
//lerpTest的值是无限插值接近10的,有个尾部缓动的效果。
lerpTest = Mathf.Lerp(lerpTest, 10, 0.1f);
//SmoothDamp插值比Lerp更细腻,计算更复杂。
dampTest = Mathf.SmoothDamp(dampTest, 10, ref speed, 1, 3);
}
Mathf.PingPong:让数值在0到Length之间来回往返
以键值对的方式记录在注册表里面的。只能储存3种基础数据类型:int float string 。
public Text text;
void Start()
{
if (PlayerPrefs.GetString("Name") == "")//String初始值是“” int初始值是0,float初始值是0f
PlayerPrefs.SetString("Name", "瓜瓜");
text.text = PlayerPrefs.GetString("Name");
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
PlayerPrefs.SetString("Name", "蛋蛋");
text.text= PlayerPrefs.GetString("Name");
}
if (Input.GetKeyDown(KeyCode.D))
{
PlayerPrefs.DeleteKey("Name");
}
}
碰撞检测发生的条件:两个游戏物体发生碰撞,必须有一方有刚体组件,两方都必须有碰撞体组件。
关于几大组件的理解
Transform:
在Unity3D中,一个空的GameObject是只有Transform信息的,记录该物体的 位置信息。
Renderer:
当一个GameObject拥有了Renderer(以及它所依赖的MeshFilter和Material等),它就会显示在我们的场景当中,表现的就是该物体有 视觉信息。
这时想象你站在该物体的附近,如果你面向该物体的位置(Transform),你就可以看到该物体在你眼前(Renderer)。但如果这时你情不自禁想伸手去摸,你是不会打到前排观众的头造成纠纷的。
Collider:
我们给当前的GameObject再加上一个Collider组件(或者新建一个Cube,该GameObject会包含Transform、MeshFilter、Collider、MeshRenderer这四个组件),这时该物体就有了 空间占位信息。
这时你再伸手去摸,你会发现你可以触碰到该物体了。但是在现实中,一个物体是会受到重力影响向下落的,或者这是一张放在桌上的钞票,你会发现你无法将它拿起并放入口袋。
Rigidbody:
我们再给该物体加上Rigidbody组件,这时该物体就有了质量、速度、移动方向等 质能信息,并可以响应外界的物理影响。
这时的钞票,你就可以看到它、碰到它、捡起它了。
综上,在“Collider”和“Rigidbody”的区分中引入第三者“Renderer”,它们就构成了模拟一个物体所需要三个基础特性:看不看得见-Renderer,摸不摸得着-Collider,挪不挪得动-Rigidbody。
Rigibody:刚体
Mass:质量
Drag:摩擦力
Angular Drag:转弯阻力
Use Gravity:是否使用重力
Is Kinematic:运动学刚体,当两个刚体发生碰撞,它不会发生位移。
Collision Detection:碰撞检测,分为三种,Discrete离散型检测、Continuous连续型检测、Continuous Dynamic连续性动态检测;检测精度依次增高。
Constraints:锁轴。Freeze Position锁轴位移;Freeze Rotation锁轴旋转。
private void OnCollisionEnter(Collision collision)
{
Debug.Log("Enter:"+collision.gameObject.name);
}
private void OnCollisionStay(Collision collision)//触发时每帧被调用一次
{
Debug.Log("Stay:" + collision.gameObject.name);
}
private void OnCollisionExit(Collision collision)
{
Debug.Log("Exit:" + collision.gameObject.name);
}
Collider:碰撞体
Is Trigger:是否转变为触发器,如果勾选则不会被碰撞,只会单纯检测。
Material:物理材质。涉及该碰撞体的摩擦力、阻力、弹性等信息。
Center:碰撞体的位置
Size:碰撞体的大小。
private void OnTriggerEnter(Collider other)
{
Debug.Log("Enter:" + other.gameObject.name);
}
private void OnTriggerStay(Collider other)//触发的时候每帧调用一次
{
Debug.Log("Stay:" + other.gameObject.name);
}
private void OnTriggerExit(Collider other)
{
Debug.Log("Exit:" + other.gameObject.name);
}
注意:刚体碰撞检测器和触发器的检测代码不会因为脚本失活而失效。