实现一个很简单的点击小游戏,学习交互相关的内容,在不实时创建销毁的情况下,使用简单工厂创建、管理、回收、复用标记。

游戏概述:点击出现标记,两秒内自动消失

游戏展示:


1.1实现点击效果。
  1.1.1用 Plane 或其他物体做地面, tag 为“Finish”
    先创建Plane,并选择tag为Finish。

  1.1.2点击地面后,出现一个圆形攻击标记,两秒后自动消失。注意:该攻击标记不能挡住点击。(Primitive Objects / Cylinder)

    1.点击对象出现事件,之前设置地板的tag为Finish,可以利用tag找到对象,对应编写事件。

if (hit.collider.gameObject.tag.Contains ("Finish"))

    2.圆形攻击标记,按提示创建Cylinder作为攻击标记。

GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);

    3.刚开始不知道不能挡住点击该如何完成,这一点是在整体实现之后才查到相关资料解决的,加上下面一句代码,把圆柱形标记设为不启用,这样就不会妨碍在同一地方继续点击生成或出现圆柱形标记。

cylinder_1.GetComponent<Collider> ().enabled = false; // 不影响再次点击

    4.整理代码,如下。

        void Update() {
Vector3 mp = Input.mousePosition;
cm = Camera.main;
Ray ray = cm.ScreenPointToRay (mp);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)) {
// 如果点击到标签为Tag的对象
if (hit.collider.gameObject.tag.Contains ("Finish")) {
Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f); GameObject cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
cylinder_1.GetComponent<Collider> ().enabled = false;
cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f); }
}
}

现在可以点击创建圆柱形标记,但是还不会消失。要求需要在两秒内自动消失,考虑增加一个类专门管理消失。(消失不是destroy,如下面所提示的,对象创建之后,放在列表内,不必释放,因为释放再重建耗费太多资源。)做到这一步,需要先使用简单工厂,先放上代码,后续在下一点再讲述。

专门管理延时的类:

  1.1.3请使用一个简单工厂创建、管理这些的标记,并自动收回这些标记(注意,这些对象创建后,放在列表内,不必释放)。
为适应下面红色字体要求,修改类名和相关函数名。
用户仅需申请使用即可 GameObject myFactory.placeAttackMark(Vector3 position)
myFactory为工厂类,其中的placeAttackMark(Vector3 position)函数为具体实现。
建立myFactory.cs,建立placeAttackMark函数和对象列表(public List<GameObject> free = new List<GameObject>();),将之前Update里面的内容放到placeAttackMark中。考虑到需要回收对象(修改位置或者隐藏,让用户无法看到),在创建新的标记时需要判断对象列表里还有没有可用的,有则复用不创建。

修改之前Update里面的内容,如下所示:重要代码后写有注释。

        public void placeAttackMark(Vector3 target) {
cm = Camera.main;
Ray ray = cm.ScreenPointToRay (target);
RaycastHit hit;
if (Physics.Raycast(ray, out hit)) {
// 如果点击到标签为Tag的对象
GameObject cylinder_1;
if (hit.collider.gameObject.tag.Contains ("Finish")) {
Vector3 finishposition = hit.point + new Vector3(0f,0.8f,0f);
if (free.Count == ) { // 如果未使用的圆柱形标记为空,则创建
cylinder_1 = GameObject.CreatePrimitive (PrimitiveType.Cylinder);
cylinder_1.GetComponent<Collider> ().enabled = false; // 不影响再次点击
cylinder_1.transform.position = hit.point+ new Vector3(0f,0.8f,0f); } else {
// 还有标记空闲,复用标记
cylinder_1 = free[];
free.RemoveAt(); // 用了之后移除
cylinder_1.transform.position = hit.point + new Vector3(0f,0.8f,0f);
}
// 两秒后自动消失
waitToRecovery wt = cylinder_1.AddComponent<waitToRecovery>();
wt.delay2min (cylinder_1, free);
}
} }

最后,在用户端直接访问 myFactory.placeAttackMark(Vector3 position)即可。
在这里,如之前一样,在myFactory里面实现了GetInstance方法。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Com.mygame; public class BaseCode : MonoBehaviour { private Camera cm;
private GameObject temp;
// Use this for initialization
void Start () {
cm = Camera.main;
} // Update is called once per frame
void Update () {
if (Input.GetMouseButtonDown ()) {
Vector3 mp = Input.mousePosition;
myFactory.GetInstance ().placeAttackMark (mp);
}
}
}

【Unity3D】点击交互——简单工厂的更多相关文章

  1. unity3d和php后台简单交互--一

    unity3d开发时,用PHP作为后台是个不错的选择.对一些数据吞吐量不是很大的游戏,比如某个游戏的排名,登录等等,一般的php程序能够胜任了,并且php语言简单,开发容易对数据库尤其是mysql的支 ...

  2. 【Unity3D】射箭打靶游戏(简单工厂+物理引擎编程)

    打靶游戏:     1.靶对象为 5 环,按环计分:    2.箭对象,射中后要插在靶上:    3.游戏仅一轮,无限 trials: 增强要求:  添加一个风向和强度标志,提高难度 游戏成品图: U ...

  3. iOS设计模式:简单工厂模式

    1.简述 首先需要说明一下,简单工厂模式不属于23种GOF设计模式之一.它也称作静态工作方法模式,是工厂方法模式的特殊实现(也就是说工厂模式包含简单工厂模式).这里对简单工厂模式进行介绍,是为后面的工 ...

  4. 网络电视精灵~分析~~~~~~简单工厂模式,继承和多态,解析XML文档,视频项目

    小总结: 所用技术: 01.C/S架构,数据存储在XML文件中 02.简单工厂模式 03.继承和多态 04.解析XML文档技术 05.深入剖析内存中数据的走向 06.TreeView控件的使用 核心: ...

  5. UNITY3D与iOS交互解决方案

    原地址:http://bbs.18183.com/thread-456979-1-1.html 本帖最后由 啊,将进酒 于 2014-2-27 11:17 编辑 “授人以鱼,不如授人以渔”,以UNIT ...

  6. 初识XML及简单工厂运用--网络电视精灵

    网络电视精灵 任务描述 1. 解析XML文件中的数据 三个简单的xml文件; <?xml version="1.0" encoding="utf-8" ? ...

  7. Java设计模式---工厂模式(简单工厂、工厂方法、抽象工厂)

    工厂模式:主要用来实例化有共同接口的类,工厂模式可以动态决定应该实例化那一个类.工厂模式的形态工厂模式主要用一下几种形态:1:简单工厂(Simple Factory).2:工厂方法(Factory M ...

  8. C#设计模式(2)-简单工厂模式

    引言 上一遍中介绍了设计模式中的单例模式-C#设计模式(1)-单例模式,本篇将介绍简单工厂模式,也是比较容易理解的一种模式: 简单工厂模式简介 什么是简单工厂模式? 定义一个工厂类,它可以根据参数的不 ...

  9. Java简单工厂模式以及来自lambda的优化

    前言    设计模式是软件工程中一些问题的统一解决方案的模型,它的出现是为了解决一些普遍存在的,却不能被语言特性直接解决的问题,随着软件工程的发展,设计模式也会不断的进行更新,本文介绍的是经典设计模式 ...

随机推荐

  1. CAS单点登录学习(二):客户端配置

    下载jar包因为cas的源码修改变动很大,所以客户端引入的jar包根据服务端的war包而定.之前搭建的cas服务端用的版本是3.5.2,经过测试,可以使用cas-client-core的3.2.1版本 ...

  2. iOS :undefined symbols for architecture x86_64

    转自:http://www.th7.cn/Program/IOS/201408/268371.shtml 问题描述:为了适配iPhone 5s的64位处理器,在编译选项中加入了arm64架构.但是发现 ...

  3. Java&nbsp;keytool命令说明

    Java keytool命令说明 Java 中的 keytool.exe (位于 JDK\Bin 目录下)可以用来创建数字证书,所有的数字证书是以一条一条(采用别名区别)的形式存入证书库的中,证书库中 ...

  4. DOM,API,CSS,href,万方db文章,数据库工程师要求

    DOM,文档对象模型(Document Object Model),是W3C组织推荐的处理可扩展标志语言的标准编程接口. API,应用程序接口 (API:Application Program Int ...

  5. 4、map和Tuple

    一.map 1.创建map //创建一个不可变的Map scala> val ages = Map("Leo" -> 30, "Jen" -> ...

  6. Spring入门第十八课

    Spring AOP AspectJ:Java社区里最完整最流行的AOP框架 在Spring2.0以上的版本中,可以使用基于AspectJ注解或者基于XML配置的AOP 看代码: package lo ...

  7. HRBUST - 1214 NOIP2000提高组 方格取数(多线程dp)

    方格取数 设有N*N的方格图(N<=10),我们将其中的某些方格中填入正整数,而其他的方格中则放人数字0.如下图所示(见样例 ,黄色和蓝色分别为两次走的路线,其中绿色的格子为黄色和蓝色共同走过的 ...

  8. this解惑

    前言 要正确理解this,首先得理解执行上下文,这里推荐汤姆大叔的执行上下文,因为this是在运行代码时确认具体指向谁,箭头函数除外. 全局作用域中的this node: 每个javaScript文件 ...

  9. 洛谷P2016 战略游戏

    P2016 战略游戏 题目描述 Bob喜欢玩电脑游戏,特别是战略游戏.但是他经常无法找到快速玩过游戏的办法.现在他有个问题. 他要建立一个古城堡,城堡中的路形成一棵树.他要在这棵树的结点上放置最少数目 ...

  10. 剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 一 . 理解题意 该题目我们可以借鉴一个非常影响不好的 ...