您的位置:首页 > 科技 > IT业 > Unity实战案例全解析 :PVZ 植物脚本分析

Unity实战案例全解析 :PVZ 植物脚本分析

2024/11/17 21:16:36 来源:https://blog.csdn.net/2301_77947509/article/details/142291281  浏览:    关键词:Unity实战案例全解析 :PVZ 植物脚本分析

         植物都继承了Pants脚本,但是我因为没注意听讲,把Pants也挂在植物上了,所以子类的PlantEnableUpdate和PlantDisableUpdate抢不过父类,无法正确触发动画,我还找不到哪里出了问题,所以就使用了携程加while强行触发了,但是经过对源码和工程的分析比对,我发现了问题所在,所以写都写了就这样吧,又不是不能跑,而且协程优化还好一些吗,气死我了呜呜,耽误了好几个小时,下次我一定好好听课呜呜呜

植物状态脚本 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using Unity.VisualScripting;
using UnityEngine;
using static ControlState;//植物状态枚举
enum PlantsState {Disable,Enable
}
public class Plants : MonoBehaviour {//拿到植物类型public PlantType plantType;PlantsState plantsState = PlantsState.Disable;private void Awake() {plantType = PlantType.Sun_Flower;Translate2Disable();}private void Update() {switch (plantsState) {case PlantsState.Disable:PlantDisableUpdate();break;case PlantsState.Enable:PlantEnableUpdate();break;default:break;}}protected virtual void PlantEnableUpdate() {}protected virtual void PlantDisableUpdate() {}public void Translate2Disable() {Debug.Log("关闭");plantsState = PlantsState.Disable;GetComponent<Animator>().enabled = false;}public void Translate2Enable() {Debug.Log("开启");plantsState = PlantsState.Enable;GetComponent<Animator>().enabled = true;}
}

向日葵脚本

using System.Collections;
using UnityEngine;
using System.Collections.Generic;
using Unity.VisualScripting;public class SunFlower : Plants {private Animator animator;public GameObject sunPrefab; // 阳光预制体public float minTime = 4f; // 最小生成时间public float maxTime = 10f;//最大生成时间public float offsetY = -0.5f;public float offsetX;private void Awake() {animator = this.GetComponent<Animator>();}private void Start() {StartCoroutine(GenerateSun());}protected override void PlantEnableUpdate() {//if (!isGeneratingSun) {//    isGeneratingSun = true;//}}private IEnumerator GenerateSun() {while (true) {// 随机等待时间float waitTime = Random.Range(minTime, maxTime);yield return new WaitForSeconds(waitTime);animator.SetTrigger("CreatSun");yield return new WaitForSeconds(1f);// 随机生成阳光位置offsetX = Random.Range(-0.5f, 0.5f);Vector3 sunPosition = new Vector3(transform.position.x + offsetX, transform.position.y + offsetY, transform.position.z);GameObject sunInstance = Instantiate(sunPrefab, transform.position, Quaternion.identity);// 获取 Sun 组件并调用 JumpTo 方法Sun sunComponent = sunInstance.GetComponent<Sun>();if (sunComponent != null) {sunComponent.JumpTo(sunPosition);}}}
}

豌豆射手脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PeashShooter : Plants
{//攻击间隔public float atkTime = 2;//攻击计时public float atkTimer=0;//豌豆预制体public GameObject peach;//豌豆实例化位置public Transform peashPos;void Start() {PlantEnableUpdate();StartCoroutine(GenerateSun());}private IEnumerator GenerateSun() {while (true) {atkTimer += Time.deltaTime;if (atkTimer > atkTime) {atkTimer = 0;Shoot();}yield return new WaitForSeconds(0);}
}public void Shoot() {GameObject.Instantiate(peach, peashPos.transform.position,Quaternion.identity);}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com