unity学习笔记----游戏练习0
一、修复植物种植的问题
1.当手上存在植物时,再次点击卡片上的植物就会在手上添加新的植物,需要修改成只有手上没有植物时才能再次获取到植物。需要修改AddPlant方法。
public bool AddPlant(PlantType plantType)
 ? ? {
 ? ? ? ? //防止手上出现多个植物
 ? ? ? ? if (currentPant != null) return false;
 ? ? ? ? PlantManagr plantPrefab = GetPlantPrefab(plantType);
 ? ? ? ? if(plantPrefab != null)
 ? ? ? ? {
 ? ? ? ? ? ? //这里需要注意的是,上面拿到的是PlantManagr,当我们去是实例化这个组件就相当于去实例化这个组件所在的GammeObject。
 ? ? ? ? ? ? currentPant = GameObject.Instantiate(plantPrefab);
 ? ? ? ? }
 ? ? ? ? else
 ? ? ? ? {
 ? ? ? ? ? ? Debug.Log("游戏物体不存在");
 ? ? ? ? ? ? return false;
 ? ? ? ? }
 ? ? ? ? return true;
 ? ? }
只有当手上没有植物时点击卡片上的植物才会获取植物。
修改点击事件,增加一个条件只有AddPlant方法返回为true时才能执行后续代码。
?public void Onclick()
 ? ? {
 ? ? ? ? if (needSunPoint > SunManager.Instance.SunPoint) return;
 ? ? ? ? //TODO:并进行种植
 ? ? ? ? bool isSuccess = HandManager.Instance.AddPlant(plantType);
 ? ? ? ? //返回true说明手上还有植物不能再次执行点击事件。
 ? ? ? ? if (isSuccess)
 ? ? ? ? {
 ? ? ? ? ? ? SunManager.Instance.SubSun(needSunPoint);
 ? ? ? ? ? ? TransitionToCooling();
 ? ? ? ? }
? ? }
这样修改后当手上存在有植物时不会再次获取到植物在手上。
2.当植物在手上时得让植物存于禁用状态
添加一个用于转换的Disable状态的方法。
? ? private void TransitionToDisable()
 ? ? {
 ? ? ? ? plantState = PlantState.Disable;
 ? ? }
同时还需要将其的Animator,在植物拿在手上时不能播放动画。
 GetComponent<Animator>().enabled = false;
二、植物种植在地面功能实现
当鼠标点击哪个格子就把植物种植在对应的植物上,如何判断鼠标点击到了哪个格子呢?因此就要给每个格子添加一个碰撞器,然后通过碰撞器其判断点击到哪个格子上了 。
 创建一个物体用于判断点击到哪个格子,在其身上添加一个组件Box Collider 2D,这样才能判断鼠标是否点击到这个格子上。通过使用OnMouseDown()事件,可以检测鼠标是否点击到这个格子身上,再将其设置为预制体。

现在将碰撞器布满背景,最后效果如下:

然后为这写碰撞器添加一个公共的父类,然后为其预制体添加一个脚本CellControl用来控制自己是否被点击到并将其设置为触发器。
在CellControl中通过使用OnMouseDown()事件去检测自身点击,当被点击时就表示要被种植了,然后将这个点击事件传递给HandManager,因为HandManager是知道要种植的植物的。
为了避免同一个位置可以种植多个植物,再写一个方法来检测并种植当前位置是否存在之植物。
因此在HandManager中写一个方法来调用,代码如下:
? ? public void OnMouseDown()
 ? ? {
 ? ? ? ? HandManager.Instance.OnCellClicke(this);
 ? ? }
? ?//检测当前位置是否存在植物
 ? ?? ? public ?bool ChechPlant(PlantManagr plant)
 ? ? {
 ? ? ? ? if (currentPlant != null) return false;
 ? ? ? ? currentPlant = plant;
 ? ? ? ? currentPlant.transform.position = transform.position;
 ? ? ? ? return true;
 ? ? }
?public void OnCellClicke(CellControl cell)
 ? ? {
 ? ? ? ? Debug.Log("OnCellClicke执行了");
 ? ? ? ? if (currentPlant == null) return;
 ? ? ? ? bool isSuccess = cell.ChechPlant(currentPlant);
 ? ? ? ? Debug.Log(isSuccess);
 ? ? ? ? //将其设置为空不让其在跟随鼠标
 ? ? ? ? if (isSuccess)
 ? ? ? ? {
 ? ? ? ? ? ? currentPlant.GetComponent<Animator>().enabled = true;
 ? ? ? ? ? ? currentPlant = null;
 ? ? ? ? }
 ? ? }
效果如下:只有当前位置没有种植过植物才能种植

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!