unity笔记(脚本2)
/// <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); } }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库