简单版捕鱼达人的制做

1、生成鱼的脚本:

 using UnityEngine;

using System.Collections;


public class GameComtroller : MonoBehaviour {

public int maxFishCount; //鱼群的最大数量
public int currentFishCount = 0; // 记录当前环境中 鱼的个数。大于maxFishCount创建鱼
float timer; //定时器
public float timerInterVal; //每间隔多久生产一条鱼

void Update () {
CreateFishes ();
}

// 创建鱼群
void CreateFishes()
{
timer += Time.deltaTime;
// 每隔timerInterVal创建一条鱼,并且 当前鱼的数量小于最大容量
if (timer >= timerInterVal) {
if (currentFishCount < maxFishCount) {
currentFishCount++;
// Object original, Vector3 position, Quaternion rotation
// 随机 获取鱼的下标 用来设置鱼的预制体
int flag = Random.Range (1, 4);
Object fish = Resources.Load ("fish" + flag); // 得到鱼的预制体
timer = 0;

// 2、视窗 -- Viewport 左下角坐标(0,0),右上角坐标(1,1)
// 取照相机Z坐标的相反数 将 位置固定到我们的背景上
float Z = -Camera.main.transform.position.z;
//得到鱼  在视窗中的相对位置
Vector3 fishPosition = new Vector3 (Random.value, Random.value, Z);
//将鱼 从视窗中的相对位置 转换到世界坐标系中
fishPosition = Camera.main.ViewportToWorldPoint (fishPosition);


// 调用鱼脚本的 创建鱼的方法 获取鱼的脚本
fishScript fs = fishScript.Birth (fish, fishPosition);
fs.sengDeathMessage += Reduce; 




}
}
}
// 鱼死后 GameColltronaller需要把当前鱼的数量 -1
void Reduce()
{
currentFishCount--;
}

}


2、鱼的移动方向的脚本:

using UnityEngine;
using System.Collections;


public class fishScript : MonoBehaviour {
//鱼的朝向
enum Fish_Direction
{
right = 1,   //scale = 1
left = -1 //scale = -1
}
Fish_Direction fish_direct; 
// 声明一个 鱼死亡的 消息代理 无参无返
public delegate void SendDeathMessageDelegate ();
// 设置 消息代理的 事件
public event SendDeathMessageDelegate sengDeathMessage;
public int Hp;

void Start () {
//设置鱼的 随机 朝向
Vector3 scale = transform.localScale;
if (Random.value > 0.5f) {
fish_direct = Fish_Direction.right;
scale.x = (float)fish_direct;
} else {
fish_direct = fishScript.Fish_Direction.left;
scale.x = (float)fish_direct;
}
transform.localScale = scale;


setMotionTarget ();
}

void Update () {
UpdeteFishMotion ();
Death ();
}
//设置鱼的移动目的地
Vector3 tragetPosition; // 目标点
void setMotionTarget()
{
//判断鱼的朝向 来设置 移动的终点
if (fish_direct == Fish_Direction.right) {//往右边
// 通过 视窗 的 位置来限定 终点在世界坐标系中的位置
Vector3 Rps = new Vector3 (1, Random.value, -Camera.main.transform.position.z);
// 把 转换后 的位置赋值给 tragetPosition
tragetPosition = Camera.main.ViewportToWorldPoint (Rps);
} else {//往左边
Vector3 Lps = new Vector3 (0, Random.value, -Camera.main.transform.position.z);
tragetPosition = Camera.main.ViewportToWorldPoint (Lps);
}
}



// 鱼的游动速度
public float fishSpeed;

// 更新鱼的位置
void UpdeteFishMotion()
{
// 移动当前物体的位置到目标点,可以设置物体 每次移动的最大距离,并且返回移动后的位置
transform.position = Vector3.MoveTowards (transform.position,tragetPosition,fishSpeed * Time.deltaTime);
// 如果 物体的位置 和目标点的距离 < 0.1f
if (Vector3.Distance (transform.position, tragetPosition) ==0) {
//把鱼的朝向 改成相反的方向
fish_direct = fish_direct == Fish_Direction.right ? Fish_Direction.left : Fish_Direction.right;
Vector3 scale = transform.localScale;
//根据fish_direct的值来操作鱼的朝向
if (fish_direct == Fish_Direction.right) {
scale.x = 1;
} else {
scale.x = -1;
}
transform.localScale = scale;

setMotionTarget ();
}
}


//静态方法 脚本对象初始化之前就可以调用 返回鱼的脚本
public static fishScript Birth(Object prefab,Vector3 position)
{
GameObject fish = Instantiate (prefab, position, Quaternion.identity) as GameObject;
//得到鱼身上的脚本 返回出去 供外界使用
return fish.GetComponent<fishScript> ();
}


//鱼死亡
void Death()
{
if (Hp <= 0) {
//临死之前 去发送一条消息 告诉鱼的制造者 gameController "I am Death"
sengDeathMessage();
//制造爆炸
Object ExplosionPrefab = Resources.Load("BoomEffect"); //得到爆炸的预制体
GameObject s = Instantiate (ExplosionPrefab,transform.position,Quaternion.identity) as GameObject;
Destroy (s, 0.3f);
Destroy (gameObject);
}
}
}

3、炮口移动角度的脚本:

using UnityEngine;
using System.Collections;


public class CannonScript : MonoBehaviour {

void Update () {
//将鼠标在屏幕上的坐标转换成 世界坐标系中的坐标
Vector3 MousePosition = Camera.main.ScreenToWorldPoint
(new Vector3( Input.mousePosition.x,Input.mousePosition.y,-Camera.main.transform.position.z));
//得到 炮口到鼠标点的向量
Vector3 tempPosition = MousePosition - transform.position;
//将炮口自身的Y轴设置 为tempPosition
transform.up = tempPosition.normalized;
if (Input.GetKeyDown  (KeyCode.Space)) {
LaunchBullet ();
}
}
// 发射子弹
void LaunchBullet()
{
//获取 子弹的预设体
Object bullet = Resources.Load ("fire");
//ransform.GetChild 获取子物体的Transform组件
Instantiate(bullet,transform.GetChild(0).position,transform.rotation);
}
}


4、子弹的脚本:

using UnityEngine;
using System.Collections;


public class BulletScript : MonoBehaviour {
public float Speed;
public int damage;

void Start () {

}


void Update () {
transform.Translate (Vector3.up * Speed * Time.deltaTime);
if (transform.position.y > 7.9f || transform.position.y < -1.4f || transform.position.x < -6.7f || transform.position.x > 13f ) {
Destroy (gameObject);
}
}
//出发检测
void OnTriggerEnter2D(Collider2D other)
{
if(other.gameObject.tag =="Player" ){
//检测子弹打到了鱼上,那么鱼Hp -1
other.GetComponent<fishScript>().Hp -= damage;
Destroy (gameObject);
}
}
}

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值