Unity实战之打靶游戏
Unity实战之打飞碟游戏
项目源码
整体描述
利用unity实现简单的打飞碟游戏,射中相应的靶即得分。一轮游戏共五发箭。
设计思路
UML图如下
定义组件
弓箭
由两部分组成:箭头和箭身。
箭头是一个比较小的胶囊体,挂载碰撞器。箭身是从Assets Store中下载的免费素材
靶
由五个同心、高度不同的圆柱组成,每个圆柱体挂载
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实战之打靶游戏相关推荐
- unity实战:狂暴机器人游戏教程(下篇)
文章目录 前言 三.敌人 3.1创建机器人 步骤1 创建脚本 **步骤2 定义生命周期** **步骤3添加射击动画** 3.2发射机器人导弹 步骤1 创建导弹运动逻辑 步骤2 添加导弹发射方法 3.3 ...
- unity 3d网络游戏实战(全).pdf_“游戏开发入门指南——Unity+”的食用指南
虽然专栏的文章已在置顶中按内容分好类了([置顶]游戏开发入门指南专栏目录),但不排除仍然有初学者面对繁杂的内容感觉无从下手.因此额外带来一篇食用指南,旨在给想要通过本专栏学习游戏开发的同学一条相对容易 ...
- unity打靶游戏的制作
这次第一个作业是一个打靶游戏,要用到老师上课所讲的物理运动,对于这次作业来说,总结一下就是刚体和碰撞的运用,先上一个效果成品图. 如图所示,射出去的箭插在了靶上,左上角显示得分情况和风力大小,正值代表 ...
- [Unity实战]unity-webgl 转换 微信小游戏[简单上手][开箱可用]
unity-webgl 转换 微信小游戏[简单上手]Unity WebGL 微信小游戏适配方案(公测 1.背景 安装与使用 2.导入unitypackage 3.配置unity-webgl 4.打包 ...
- Unity 和腾讯游戏成立联合创新实验室:从技术创新探索游戏产品新模式和概念
2019年5月12日,Unity和腾讯游戏共同宣布成立联合创新实验室.双方将充分发挥各自深耕在游戏领域多年的技术优势,协同创新.共同探索未来游戏产品新模式和概念,致力于技术上的飞跃性突破,为中国游戏行 ...
- ❤️UNITY实战进阶-OBB包围盒详解-6
❤️UNITY实战进阶-三维AABB包围盒详解-6_欲望如海水,越喝越渴.-CSDN博客前言 碰撞检测问题在虚拟现实.计算机辅助设计与制造.游戏.机器人等方面都有着广泛的应用,而包围盒算法是进行碰撞检 ...
- Tiled结合Unity实现瓦片地图——Unity实战篇
本系列文章由Aimar_Johnny编写,欢迎转载,转载请标明出处,谢谢. http://blog.csdn.net/lzhq1982/article/details/75425915 上文说道,Ti ...
- Unity实战之牧师与魔鬼(动作分离版)
Unity实战之牧师与魔鬼(动作分离版) 项目链接 整体描述 本次项目在第一版牧师与魔鬼的基础上,将动作从场记中分离出来,并设计一个裁判类实时监测游戏进行的情况.这样改进的优点有很多: 降低了不同功能 ...
- 如何使用 Unity制作微信小游戏,微信小游戏制作方案 最新完整详细教程来袭【持续更新】
前言 Unity实战篇 | Unity制作微信小游戏,最新详细教程来袭[持续更新] 一.方案特点 二.技术原理 三.转换案例 四.安装与使用方法 4.1 查阅推荐的引擎版本,安装时选择WebGL组件 ...
最新文章
- 俄罗斯研发替身机器人,危险工作无需真人
- 大白话系列之C#委托与事件讲解大结局
- [NOTE] WebGoat v8.2.2学习笔记
- 硬件:选购CPU和显卡需了解的参数,TDP、SDP、ACP、GCP、TBP是什么?
- 【转】掀起Azure AD的盖头来——深入理解Microsoft Graph应用程序和服务权限声明
- c# MEF框架(一 MEF简介及简单的Demo)
- 精选9个不错的HTML5播放器
- 张开双臂迎接“云时代“的到来
- 近期会将视频在线课堂移植ios,欢迎大家关注
- 农村人深加工红薯,一招增值数倍,机器一条龙操作省人力
- 20. Django进阶:生成csv文件
- java byte数组与16进制间的相互转换
- 骨骼动画驱动理解, blender 驱动骨骼
- 张飞流水帐(完整版)
- Unity接入苹果内购(IAP)
- 语音识别(一)——概述
- 3、哈哈哈-(2)hahaha1.py
- 如何防御UDP攻击?
- python代码~六角星小练习
- 华为手机日历倒计时_igc 4周年庆倒计时!积分众乐乐赢华为手机
热门文章
- Android仿Qzone底部导航栏加号弹出菜单
- 如何通过SQL Server语句查询三个月内的信息代码的教程方法
- 解决jenkins发版报错:JAR will be empty - no content was marked for inclusion
- 只用70行代码,手把手教你遍历当前windows所有进程!
- CnPeng说:“快应用”的慢节奏
- java joda 获取utc时间_Java获取时间与系统时间相差8小时终极解决方案
- [七七黎]乱七八糟-美女和野兽
- Linux学习笔记(3)- 网络编程以及范例程序
- 33个非常实用的JavaScript一行代码
- Java学习之【Object】