/// <summary>
/// 倒计时器
/// </summary>
public class CountdownTimer : MonoBehaviour
{
public int second = 120;
private Text txtTimer;
private void Start()
{
txtTimer = GetComponent<Text>();
//重复调用(要执行的方法名称,开始调用时间,调用间隔)
InvokeRepeating("Timer", 1, 1);
//延迟调用
//Invoke("需要调用的方法名称", 调用时间);
}
private float nextTime = 1;//下一次改变时间
private void Update()
{
//如果(按住鼠标左键 && nextTime <= Time.time)
// 则发射子弹 nextTime = Time.time + 0.1f;
//如果(按住鼠标左键)
//totalTime += Time.deltaTime;
// if(totalTime >=0.1f)
// 则发射子弹 totalTime = 0;
//沿多个路点移动,到达目标等待一段时间。
//如果到达目标点
//totalTime += Time.deltaTime;
// if(totalTime >=3)
// 设置目标点 totalTime = 0
//Timer();
}
//Time.time 实现
//试用场合:发射子弹
private void Timer1()
{
//如果时间到了
if (nextTime <= Time.time)
{
second--;//119 1:59
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
nextTime = Time.time + 1;//在当前时间上增加1s
if (second <= 10) txtTimer.color = Color.red;
if (second <= 0) enabled = false;
}
}
//Time.deltaTime 实现
//试用场合:沿多个路点移动,每次到达路点等待一段时间。
private float totalTime = 0;
private void Timer2()
{
//累加每帧消耗时间
totalTime += Time.deltaTime;
//如果1s
if (totalTime>=1)
{
second--;//119 1:59
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
totalTime = 0;//清空累加的时间
}
}
//InvokeRepeating 实现
//试用场合:计时器。每间隔固定时间 执行1次
private void Timer()
{
second--;//119 1:59
txtTimer.text = string.Format("{0:d2}:{1:d2}", second / 60, second % 60);
if (second <= 0)
CancelInvoke("Timer");//取消调用
}
}
/// <summary>
/// 门
/// </summary>
public class Door : MonoBehaviour
{
public bool doorState=false;
private Animation anim;
public string animName = "Door";
private void Start()
{
anim = GetComponent<Animation>();
}
//当用户按下当前物体Collider时执行
private void OnMouseDown()
{
if (doorState)
{
//如果当前动画组件没有播放动画片段
if (!anim.isPlaying) anim[animName].time = anim[animName].length;
//关门 1 -->0
anim[animName].speed = -1;
}
else
{
//开门 0-->1
anim[animName].speed = 1;
}
anim.Play(animName);
doorState = !doorState;
}
}
/// <summary>
///
/// </summary>
public class FindEnemyDemo : MonoBehaviour
{
private void OnGUI()
{
if (GUILayout.Button("查找血量最低的敌人"))
{
//1.通过标签获取敌人
//GameObject[] allEnemyGO = GameObject.FindGameObjectsWithTag("Enemy");
//Enemy[] allEnemy = new Enemy[allEnemyGO.Length];
//for (int i = 0; i < allEnemyGO.Length; i++)
//{
// allEnemy[i] = allEnemyGO[i].GetComponent<Enemy>();
//}
//2.通过类型获取敌人
Enemy[] allEnemy = FindObjectsOfType<Enemy>();
Enemy min = FindEnemyByMinHP(allEnemy);
min.GetComponent<MeshRenderer>().material.color = Color.red;
}
if (GUILayout.Button("查找距离最近的敌人"))
{
Enemy[] allEnemy = FindObjectsOfType<Enemy>();
Enemy minDistance = FindeEnemyByMinDistance(allEnemy,transform);
minDistance.GetComponent<MeshRenderer>().material.color = Color.red;
}
}
public Enemy FindEnemyByMinHP(Enemy[] enemys)
{
Enemy min = enemys[0];
for (int i = 1; i < enemys.Length; i++)
{
if (min.HP > enemys[i].HP)
min = enemys[i];
}
return min;
}
//练习2:获取最近的敌人
//float distance = Vector3.Distance(物体1.位置,物体2.位置);
public Enemy FindeEnemyByMinDistance(Enemy[] enemys,Transform targetTF)
{
Enemy min = enemys[0];
float minDistance = Vector3.Distance(min.transform.position,targetTF.position );
for (int i = 1; i < enemys.Length; i++)
{
float distance = Vector3.Distance( enemys[i].transform.position,targetTF.position);
if (minDistance > distance)
{
min = enemys[i];
minDistance = distance;
}
}
return min;
}
}
/// <summary>
///
/// </summary>
public class TimeDemo : MonoBehaviour
{
public float speed = 10;
private void OnGUI()
{
if (GUILayout.Button("游戏暂停"))
{
Time.timeScale = 0;
}
if (GUILayout.Button("游戏继续"))
{
Time.timeScale = 1;
}
if (GUILayout.Button("慢动作"))
{
Time.timeScale = 0.1f;
}
/*
Time.timeScale
不影响渲染 所以 Update 执行间隔不受影响
影响物理更新 所以FidexUpdate执行间隔受间隔
Time.deltaTime 受影响
*/
}
public float deltaTime, unscaledDeltaTime, time, unscaledTime;
private void Update()
{
//本帧时间 - 上一帧时间
//上一帧消耗时间
deltaTime = Time.deltaTime;
unscaledDeltaTime = Time.unscaledDeltaTime;
time = Time.time;
unscaledTime = Time.unscaledTime;
//机器性能差/渲染量大 每帧执行间隔大 每秒渲染次数少(Update执行次数少) 希望 每次多旋转
//机器性能好/渲染量小 每帧执行间隔小 每秒渲染次数多(Update执行次数多) 希望 每次少旋转
//每帧沿Y轴旋转1度
//transform.Rotate(0, 1, 0);
//如果Update执行次数少 那么deltaTime数值大
// 多 小
//总结:如果在Update中对物体做物理操作(移动/旋转/力)
// 需要在速度上 乘以 每帧消耗时间,用以得到恒定的速度。
//transform.Rotate(0, speed * Time.deltaTime, 0);
//如果希望游戏暂停后,当前物体不受影响
transform.Rotate(0, speed * Time.unscaledDeltaTime, 0);
}
private void FixedUpdate()
{
transform.Rotate(0, speed * Time.deltaTime, 0);
}
}