屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)
游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置
实现方式
Camera.main.WorldToScreenPoint
Camera.main.ScreenToWorldPoint
3D打地鼠实例
我这里用到的素材都比较简陋,几乎全是用Unity做的
首先是锤子

就是两个Cylinder,在把手的位置放一个空物体用于模拟锤子的动作,命名为Hammer,把锤子作为Hammer的子物体,给Hammer添加Animation动画:

在三个关键帧位置设置Hammer的Rotation,分布为(45, 0, 0),(-15, 0, 0),(45, 0, 0)
把锤子头部的Tag改为Hammer,并添加刚体,勾选UseGravity和IsKinematic,用于触发打到地鼠事件
然后是地鼠
这里就用Capsule代替了
然后给Capsule添加Animation动画,并放在一个空物体上,命名为Mouse,更改Tag为Mouse
为Capsule添加脚本
public class MouseController : MonoBehaviour {
/// <summary>
/// Recycles the mouse.
/// </summary>
public void RecycleMouse()
{
// Destroy(transform.parent.gameObject);
//对象池回收.
MousePool.Instance.RecycleMouse(transform.parent.gameObject);
}
//被打到时的触发方法.
void OnTriggerEnter(Collider other)
{
if(other.tag == "Hammer")
{
print("Score");
RecycleMouse();
}
}
}

在四个关键帧位置设置Capsule的Position分别为(0, -1, 0),(0, 0, 0),(0, 0, 0),(0, -1, 0)
将Mouse拖为预设体
锤子的动画状态机:

布置洞口
为了能看到地鼠的出没,我这里用PS简单的做了一张有有透明洞口的png图片:
<=这里有一张看不见的图片。。。
新建一个Material,将Shader该为Transparent/Diffuse,把上面那张图片拖上去
新建9个Cube,把刚才新建的Material赋予它,改变位置和大小,调整摄像机,最终结果如下:

下面是锤子上的代码:
public class HammerController : MonoBehaviour {
Animator anim;
Transform head;
void Start () {
anim = this.GetComponent<Animator>();
head = GameObject.Find("Head").transform;
}
Vector3 newPosition;
Vector3 screenPos;
void Update () {
MouseShow();
HammerMove();
}
//记时器.
float timer = ;
//地鼠的预设体.
public GameObject mousePrefab;
int ranIndexX;
int ranIndexY;
//Mouse出现的方法.
void MouseShow()
{
timer += Time.deltaTime;
//每过1s生产一个地鼠.
if(timer > )
{
timer -= ;
ranIndexX = Random.Range(, );
ranIndexY = Random.Range(, );
//通过对象池生成地鼠.
MousePool.Instance.InstantiateMouse(mousePrefab, new Vector3(ranIndexX * , , ranIndexY * ), Quaternion.identity);
}
}
//锤子的移动和动画控制器.
void HammerMove()
{
if(Input.GetMouseButtonDown())
{
anim.SetTrigger("Attack");
}
//将锤子的坐标转换为其在屏幕上的坐标,并保持y轴位置不变.
screenPos = Camera.main.WorldToScreenPoint(new Vector3(transform.position.x, , transform.position.z));
//鼠标位置.
newPosition = new Vector3(Input.mousePosition.x, Input.mousePosition.y, screenPos.z);
//将得到的屏幕坐标转换为世界坐标.
transform.position = Camera.main.ScreenToWorldPoint(newPosition);
}
}
最后是对象池的代码:
public class MousePool {
//对象池.
Dictionary<string, List<GameObject>> pool = new Dictionary<string, List<GameObject>>();
//单例模式.
private static MousePool instance;
public static MousePool Instance {
get {
if(instance == null)
{
instance = new MousePool();
}
return instance;
}
}
private MousePool(){}
//对象的存储类别.
string tags;
GameObject mouse;
//对象池管理方法.
public GameObject InstantiateMouse(GameObject prefab, Vector3 position, Quaternion rotation)
{
tags = prefab.tag;
//如果对象池中存在该类别并且数码大于0,则从对象池中取出该对象,否则实例化一个该对象.
if(pool.ContainsKey(tags) && pool[tags].Count > )
{
mouse = pool[tags][];
pool[tags].Remove(mouse);
mouse.transform.position = position;
mouse.transform.rotation = rotation;
mouse.SetActive(true);
}else{
if(!pool.ContainsKey(tags))
{
pool.Add(tags, new List<GameObject>());
}
mouse = GameObject.Instantiate(prefab, position, rotation) as GameObject;
}
return mouse;
}
//回收方法.
public void RecycleMouse(GameObject mouse)
{
pool[mouse.tag].Add(mouse);
mouse.SetActive(false);
}
}
好了,游戏基本完成
屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)的更多相关文章
- Java对象池技术的原理及其实现
看到一片有关于java 对象基础知识,故转载一下,同时学习一下. 摘 要 本文在分析对象池技术基本原理的基础上,给出了对象池技术的两种实现方式.还指出了使用对象池技术时所应注意的问题. 关键词 对象池 ...
- JedisCluster中应用的Apache Commons Pool对象池技术
对象池技术在服务器开发上应用广泛.在各种对象池的实现中,尤其以数据库的连接池最为明显,可以说是每个服务器必须实现的部分. apache common pool 官方文档可以参考:https://c ...
- Java中的对象池技术
java中的对象池技术,是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间.对象池其实也就是一个内存 ...
- 对象池技术和通用实现GenericObjectPool
对象池技术其实蛮常见的,比如线程池.数据库连接池 他们的特点是:对象创建代价较高.比较消耗资源.比较耗时: 比如 mysql数据库连接建立就要先建立 tcp三次握手.发送用户名/密码.进行身份校验.权 ...
- 基于Netty包中的Recycler实现的对象池技术详解
一.业务背景 当项目中涉及到频繁的对象的创建和回收的时候,就会出现频繁GC的情况,这时就出现了池化的技术来实现对象的循环使用从而避免对象的频繁回收,Netty包下的Recycler就实现了这一功能.当 ...
- 大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池
第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- common-pool2对象池(连接池)的介绍及使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- javascript设计模式学习之四——单例模式,缓存与对象池
单例模式的定义:确保一个实例,并提供全局访问. 惰性单例的定义:只在需要的时候才创建对象. 在开发中,有些对象往往只需要一个,比如线程池.全局缓存.浏览器中的window对象等. java中的单例 关 ...
随机推荐
- jquery新版本不支持toggle()的解决方法
toggle() 方法用于绑定两个或多个事件处理器函数,以响应被选元素的轮流的 click 事件. 在1.9以后官方废除了这个方法: 解决如下 在需要调用的js文件下引用 $.fn.toggle = ...
- [转]numpy线性代数基础 - Python和MATLAB矩阵处理的不同
转自:http://blog.csdn.net/pipisorry/article/details/45563695 http://blog.csdn.net/pipisorry/article/de ...
- 记JavaScript的入门学习(一)
2016年11月20日算是每天都会利用点时间去思考,去学习,接下来便是我学习JavaScript的前前后后,希望早日学完JavaScript和jQuery 之前学校毕业设计选择了一个如下图的题目 希望 ...
- EmbossMaskFilter BlurMaskFilter 学习
MaskFilter类可以为Paint分配边缘效果.对MaskFilter的扩展可以对一个Paint边缘的alpha通道应用转换.Android包含了下面几种MaskFilter: BlurMaskF ...
- USACO 3.1 Humble Numbers
Humble Numbers For a given set of K prime numbers S = {p1, p2, ..., pK}, consider the set of all num ...
- jmeter命令行运行-分布式测试
上一篇文章我们说到了jmeter命令行运行但是是单节点下的, jmeter底层用java开发,耗内存.cpu,如果项目要求大并发去压测服务端的话,jmeter单节点难以完成大并发的请求,这时就需要对j ...
- 博客停写,搬家到www.54kaikai.com
博客搬家到自己的网站了www.54kaikai.com欢迎访问.
- 用Redis作为Mysql数据库的缓存【转】
用Redis作Mysql数据库缓存,必须解决2个问题.首先,应该确定用何种数据结构存储来自Mysql的数据:在确定数据结构之后,还要考虑用什么标识作为该数据结构的键. 直观上看,Mysql中的数据都是 ...
- 给Cygwin重新安装curl
之前已经安装过了cygwin了,但是重装了系统了. 不过发现cygwin倒是还可以继续使用. 现在想要使用其中的curl工具. 但是却在cygwin安装目录 E:\dev_install_root\c ...
- magento中对获取的数据在前台进行分页显示
1.数据加载类class Bf170_Bf170Logistics_Block_Inquiry_Index extends Mage_Core_Block_Template { publ ...