Unity实战之打飞碟游戏

项目源码

整体描述

利用unity实现简单的打飞碟游戏,射中相应的靶即得分。一轮游戏共五发箭。

设计思路

UML图如下

定义组件

  1. 弓箭

    由两部分组成:箭头和箭身。

    箭头是一个比较小的胶囊体,挂载碰撞器。箭身是从Assets Store中下载的免费素材

  1. 由五个同心、高度不同的圆柱组成,每个圆柱体挂载RingData,对应不同的分数

代码实现

CCShootAction: 实现箭的发射事件

public class CCShootAction : SSAction
{Vector3 force;Vector3 wind;private CCShootAction(){}// Start is called before the first frame updatepublic override void Start(){gameObject.transform.parent = null;gameObject.GetComponent<Rigidbody>().velocity = Vector3.zero;// force = new Vector3(0, 0, 30);// Impulse:向此刚体添加瞬时力冲击,考虑其质量。gameObject.GetComponent<Rigidbody>().AddForce(force, ForceMode.Impulse);gameObject.GetComponent<Rigidbody>().AddForce(wind, ForceMode.Impulse);gameObject.GetComponent<Rigidbody>().isKinematic = false;}// Update is called once per framepublic override void Update(){}public override void FixedUpdate(){// 箭飞到场外或者中靶if(this.transform.position.z > 35 || this.transform.tag == "onTarget"){Debug.Log("回调");this.destroy = true;this.enable = false;this.callback.SSActionEvent(this, SSActionEventType.Completed, 0, null, gameObject);}}public static CCShootAction GetSSAction(Vector3 wind){CCShootAction shoot = CreateInstance<CCShootAction>();shoot.force = new Vector3(0, 0, 40);shoot.wind = wind;return shoot;}
}

CCShootActionManager: 实现射箭动作管理

public class CCShootActionManager : SSActionManager
{public FirstController firstController;public CCShootAction shoot;// Start is called before the first frame updateprotected void Start(){firstController = (FirstController)SSDirector.GetInstance().CurrentScenceController;firstController.actionManager = this;}public void Shoot(GameObject arrow, Vector3 wind){Debug.Log("Shoot");shoot = CCShootAction.GetSSAction(wind);this.RunAction(arrow, shoot, this);}
}

TrembleAction: 箭射中后的颤抖动作,在回调函数中调用

public class TrembleAction : SSAction
{float tremble_radius = 0.05f;float tremble_time = 0.5f; GameObject arrow;Vector3 arrow_pos;private TrembleAction(){}public static TrembleAction GetSSAction(){TrembleAction tremble_action = CreateInstance<TrembleAction>();return tremble_action;}// Start is called before the first frame updatepublic override void Start(){//得到箭中靶时的位置arrow_pos = gameObject.transform.position;// this.transform.Translate(new Vector3(0, 0, 0.5f));Debug.Log(gameObject.transform.name);}// Update is called once per framepublic override void Update(){   tremble_time -= Time.deltaTime;//需要继续颤抖if(tremble_time > 0){// gameObject.transform.Translate(new Vector3(0.02f, 0, 0));Vector3 head_pos = gameObject.transform.position;float x = arrow_pos.x + Random.RandomRange(-0.05f, 0.05f);float y = arrow_pos.y + Random.RandomRange(-0.05f, 0.05f);float z = arrow_pos.z;gameObject.transform.position = new Vector3(x, y, z);}else{gameObject.transform.position = arrow_pos;}// else{//     transform.position = arrow_pos;//     this.destroy = true;//     this.callback.SSActionEvent(this);// }}
}

具体应用在SSActionManager

public void SSActionEvent(SSAction source,SSActionEventType events = SSActionEventType.Completed,int intParam = 0,string strParam = null,GameObject arrow = null){TrembleAction trembleAction = TrembleAction.GetSSAction();this.RunAction(arrow, trembleAction, this);}

ArrowFactory: 箭的工厂,用于生产、释放弓箭

public class ArrowFactory : MonoBehaviour
{private List<GameObject> used;private List<GameObject> free;public GameObject arrow;FirstController firstController;// Start is called before the first frame updatevoid Start(){firstController = (FirstController)SSDirector.GetInstance().CurrentScenceController;used = new List<GameObject>();free = new List<GameObject>();arrow = null;}// Update is called once per framevoid Update(){}public GameObject GetArrow(){if(free.Count > 0){arrow = free[0];free.Remove(free[0]);if(arrow.tag == "onTarget")//箭在靶子上{arrow.GetComponent<Rigidbody>().isKinematic = false;arrow.tag = "arrow";arrow.transform.GetChild(0).gameObject.SetActive(true);}arrow.SetActive(true);}else{arrow = Instantiate(Resources.Load<GameObject>("Prefabs/arrow1"));arrow.GetComponent<Rigidbody>().isKinematic = false;// arrow.AddComponent<Rigidbody>();}// firstController = (FirstController)SSDirector.GetInstance().CurrentScenceController;// Transform pos = firstController.bow.transform.GetChild(0);// arrow.transform.position = pos.transform.position;arrow.transform.parent = firstController.bow.transform;   // 把arrow附加在bow上,跟随着bow移动arrow.transform.position = firstController.bow.transform.position;used.Add(arrow);return arrow;}public void FreeArrow(GameObject arrow){foreach(GameObject aa in used){Debug.Log("befreed");if(aa.gameObject.GetInstanceID() == arrow.GetInstanceID()){arrow.SetActive(false);used.Remove(aa);aa.tag = "arrow";break;}}}public void Clear(){foreach(GameObject dd in used){dd.transform.position = new Vector3(0, 0, 100);Destroy(dd);}foreach(GameObject dd in free){dd.transform.position = new Vector3(0, 0, 100);Destroy(dd);}used.Clear();free.Clear();}
}

RingData: 挂载在每个环上,用于定义不同环的分数

public class RingData : MonoBehaviour {public int score;public void Start(){if(this.gameObject.name=="1"){score = 5;}else if(this.gameObject.name=="2"){score = 4;}else if(this.gameObject.name=="3"){score = 3;}else if(this.gameObject.name=="4"){score = 2;}else{score = 1;}}
}

RingController: 控制环的撞击事件、计分、回调颤抖动作

public class RingController : MonoBehaviour
{public ScoreRecorder scoreRecorder;public ISceneController sceneController;// Start is called before the first frame updatevoid Start(){sceneController = SSDirector.GetInstance().CurrentScenceController as FirstController;scoreRecorder = Singleton<ScoreRecorder>.Instance;this.gameObject.AddComponent<RingData>();}// Update is called once per framevoid OnTriggerEnter(Collider arrowCollider){Debug.Log("碰撞!");Transform arrow = arrowCollider.gameObject.transform.parent;Debug.Log(arrow.gameObject.name);if(arrow == null){Debug.Log("null");return;}scoreRecorder.RecordScore(this.gameObject.GetComponent<RingData>().score);Debug.Log("Score:"+this.gameObject.GetComponent<RingData>().score);arrow.GetComponent<Rigidbody>().isKinematic = true;arrow.GetComponent<Rigidbody>().velocity = new Vector3(0, 0, 0);arrowCollider.gameObject.SetActive(false);arrow.tag = "onTarget";}
}

Unity实战之打靶游戏相关推荐

  1. unity实战:狂暴机器人游戏教程(下篇)

    文章目录 前言 三.敌人 3.1创建机器人 步骤1 创建脚本 **步骤2 定义生命周期** **步骤3添加射击动画** 3.2发射机器人导弹 步骤1 创建导弹运动逻辑 步骤2 添加导弹发射方法 3.3 ...

  2. unity 3d网络游戏实战(全).pdf_“游戏开发入门指南——Unity+”的食用指南

    虽然专栏的文章已在置顶中按内容分好类了([置顶]游戏开发入门指南专栏目录),但不排除仍然有初学者面对繁杂的内容感觉无从下手.因此额外带来一篇食用指南,旨在给想要通过本专栏学习游戏开发的同学一条相对容易 ...

  3. unity打靶游戏的制作

    这次第一个作业是一个打靶游戏,要用到老师上课所讲的物理运动,对于这次作业来说,总结一下就是刚体和碰撞的运用,先上一个效果成品图. 如图所示,射出去的箭插在了靶上,左上角显示得分情况和风力大小,正值代表 ...

  4. [Unity实战]unity-webgl 转换 微信小游戏[简单上手][开箱可用]

    unity-webgl 转换 微信小游戏[简单上手]Unity WebGL 微信小游戏适配方案(公测 1.背景 安装与使用 2.导入unitypackage 3.配置unity-webgl 4.打包 ...

  5. Unity 和腾讯游戏成立联合创新实验室:从技术创新探索游戏产品新模式和概念

    2019年5月12日,Unity和腾讯游戏共同宣布成立联合创新实验室.双方将充分发挥各自深耕在游戏领域多年的技术优势,协同创新.共同探索未来游戏产品新模式和概念,致力于技术上的飞跃性突破,为中国游戏行 ...

  6. ❤️UNITY实战进阶-OBB包围盒详解-6

    ❤️UNITY实战进阶-三维AABB包围盒详解-6_欲望如海水,越喝越渴.-CSDN博客前言 碰撞检测问题在虚拟现实.计算机辅助设计与制造.游戏.机器人等方面都有着广泛的应用,而包围盒算法是进行碰撞检 ...

  7. Tiled结合Unity实现瓦片地图——Unity实战篇

    本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75425915 上文说道,Ti ...

  8. Unity实战之牧师与魔鬼(动作分离版)

    Unity实战之牧师与魔鬼(动作分离版) 项目链接 整体描述 本次项目在第一版牧师与魔鬼的基础上,将动作从场记中分离出来,并设计一个裁判类实时监测游戏进行的情况.这样改进的优点有很多: 降低了不同功能 ...

  9. 如何使用 Unity制作微信小游戏,微信小游戏制作方案 最新完整详细教程来袭【持续更新】

    前言 Unity实战篇 | Unity制作微信小游戏,最新详细教程来袭[持续更新] 一.方案特点 二.技术原理 三.转换案例 四.安装与使用方法 4.1 查阅推荐的引擎版本,安装时选择WebGL组件 ...

最新文章

  1. 俄罗斯研发替身机器人,危险工作无需真人
  2. 大白话系列之C#委托与事件讲解大结局
  3. [NOTE] WebGoat v8.2.2学习笔记
  4. 硬件:选购CPU和显卡需了解的参数,TDP、SDP、ACP、GCP、TBP是什么?
  5. 【转】掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明
  6. c# MEF框架(一 MEF简介及简单的Demo)
  7. 精选9个不错的HTML5播放器
  8. 张开双臂迎接“云时代“的到来
  9. 近期会将视频在线课堂移植ios,欢迎大家关注
  10. 农村人深加工红薯,一招增值数倍,机器一条龙操作省人力
  11. 20. Django进阶:生成csv文件
  12. java byte数组与16进制间的相互转换
  13. 骨骼动画驱动理解, blender 驱动骨骼
  14. 张飞流水帐(完整版)
  15. Unity接入苹果内购(IAP)
  16. 语音识别(一)——概述
  17. 3、哈哈哈-(2)hahaha1.py
  18. 如何防御UDP攻击?
  19. python代码~六角星小练习
  20. 华为手机日历倒计时_igc 4周年庆倒计时!积分众乐乐赢华为手机

热门文章

  1. Android仿Qzone底部导航栏加号弹出菜单
  2. 如何通过SQL Server语句查询三个月内的信息代码的教程方法
  3. 解决jenkins发版报错:JAR will be empty - no content was marked for inclusion
  4. 只用70行代码,手把手教你遍历当前windows所有进程!
  5. CnPeng说:“快应用”的慢节奏
  6. java joda 获取utc时间_Java获取时间与系统时间相差8小时终极解决方案
  7. [七七黎]乱七八糟-美女和野兽
  8. Linux学习笔记(3)- 网络编程以及范例程序
  9. 33个非常实用的JavaScript一行代码
  10. Java学习之【Object】