unity学习笔记----游戏练习05

一、阳光的收集和搜集动画开发

1.收集阳光的思路:当鼠标点击到阳光的时候,就可以进行收集了。可以通过为添加一个碰撞器来检测Circle Collider 2D

编写脚本:

在SunManager中写一个增加阳光的方法

//增加阳光

public void AddSubSun(int Point)

{

sunPoint += Point;

UpdataSunPointText();

}

这里需要注意的是,由于地面也有碰撞器,他会优先去检测离相机近,如果他们一样近阳光身上的触发器就可能不会触发,就需要改变阳光的z坐标,让其离相机更近。这样就能检测到阳光。

阳光收集的效果是,当点击阳光后阳光移动到这个位置后销毁阳光数量增加。

因此需要一个获取这个组件坐标的

public Vector3 GetSunPointTextPosition()

{

return sunPointTextPosition;

}

//获取组件的坐标

private void CalcSunPointTextPosition()

{

//将其转换为世界坐标系

Vector3 position = Camera.main.ScreenToWorldPoint(sunPointText.transform.position);

position.z = 637;

sunPointTextPosition = position;

}

在SunFlower中写一个鼠标点击事件

//检测鼠标点击到阳光

public void OnMouseDown()

{

SunManager.Instance.AddSubSun(Point);

transform.DOMove(SunManager.Instance.GetSunPointTextPosition(), moveDuration)

.SetEase(Ease.OutQuad)

.OnComplete(

() =>

{

Destroy(this.gameObject);

});

}

当阳光移动到位置后将其销毁。效果如下:

这样会看到阳光被遮罩了,因此需要将Canvas的渲染模式改为屏幕空间-摄像机,这样阳光就不会被遮盖了。

2.阳光通过自然生成

阳光在这个范围内随机生成,在这个场景的外面,生成后从上方落下来

需要一个随机数来生成坐标,需要用到时间间隔和计时器

void ProduceSun()

{

produceTime += Time.deltaTime;

if(produceTime > produceTimer)

{

produceTime = 0;

Vector3 position = new Vector3(Random.Range(-340, 475), 558, 636);

GameObject go = GameObject.Instantiate(sunPrefab, position, Quaternion.identity);

position.y = Random.Range(-260, 260);

}

}

一定时间间隔后就会在一个随机位置生成一个阳光的预制体,获取一个随机的下路位置。生成阳光的预制体后还要让阳光下落到随机位置上。因此在Suncontrol脚本中需要一个用于下落的方法。

public void LinearTo(Vector3 targetPodition)

{

transform.DOMove(targetPodition, moveDuration);

}

然后调用这个方法,将这代码补齐在ProduceSun方法的后面。

go.GetComponent<SunControl>().LinearTo(position);

代码运行效果如下:

二.豌豆射手的开发

1.制作豌豆射手的动画,选中豌豆射手的图片,将其拖拽到场景中生成动画

2.设置豌豆设置的发射功能

创建脚本用于控制豌豆射手,因为豌豆射手也是植物因此也要其和太阳花一样继承于PlantManagr

public class PesshooterConter : PlantManagr

在PlantManagr中有个EnableUpdata()方法,

private void Update()

{

switch (plantState)

{

case PlantState.Disable:

DisableUpdata();

break;

case PlantState.Enable:

EnableUpdata();

break;

default:

break;

}

}

要实现豌豆射手的射击功能就在EnableUpdata中进行控制。当豌豆射手被启用的时候,去重写EnableUpdata方法,在这个里面去控制他的射击。

这里涉及到了,方法的重新和多态

方法重写(Method Overriding): 子类可以提供对其父类中已定义方法的新实现。这就是所谓的方法重写。EnableUpdata 方法在子类 SunFlower 中被重写,以提供与父类中相同方法名的新实现

多态(Polymorphism): 多态是一种允许对象在运行时表现出不同形态的特性。在方法重写的情况下,多态允许你在不知道对象具体类型的情况下调用相同的方法名,而实际上会执行该对象实际类型的实现。Update 方法是多态的一个示例,因为它会根据对象的实际类型调用相应的 EnableUpdata 或 DisableUpdata 方法。

要实现这个方法时间间隔和计时器,在实例化豌豆时需要一个位置,在为豌豆设置创建一个子物体,将其调整到合适的位置。

public float shootDuration;//间隔
private float shootTimer;//计时器
public GameObject shootPointTransform;//子物体

重写EnableUpdata方法,在这个里面去控制他的射击。

protected override void EnableUpdata()
{
shootTimer += Time.deltaTime;
if(shootTimer > shootDuration)
{
shootTimer = 0;
shoot();
}
}

当时达到时间间隔后,就会调用shoot方法进行射击。

相关推荐
代码山河10 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
sbjdhjd10 小时前
网工进阶笔记:H3CSE 园区网全栈技术与协议汇总
网络·笔记·云计算·ssh·网络工程·vlan·aaa
释厄62310 小时前
AI学习层更新与跨体转移律——人类社会同构·不缺理解缺 U
人工智能·学习
海绵宝宝的月光宝盒13 小时前
14-AutoCAD-阵列命令应用与案例实战(AR)
经验分享·笔记·自动化·课程设计·制造·学习方法·cad
小嘉丶学长14 小时前
Day14 · 字典与集合
java·开发语言·网络·python·学习·1024程序员节
白山编程大哥15 小时前
接口幂等性是什么?如何设计?
笔记
ACP广源盛1392462567315 小时前
6 盘位存储扩展方案选型笔记:YLB3116 @ACP评估记录
笔记·硬件架构·硬件工程·国产芯片
小李不想当小白15 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
weixin_4481199417 小时前
Datawhale Jev Cookbook 202610 笔记3
笔记
姚瑞南17 小时前
【PRD】招投标商机雷达爬虫系统
人工智能·经验分享·笔记·爬虫·产品运营·产品经理