背景

首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习Unity3D的方式主要是两种,一种是直接看高质量的源码,另一种是光看不行还要自己动手,自己写一些有代表性的小程序,这也是本文的由来。

诚然,现在已经不是Unity3D发展的黄金期了,很多知识点已经有很多朋友总结分享了,但由于Unity3D的客观性就是依赖插件很厉害,这样就会照成插件满天飞,通用性不强,还有过时的风险,还有就是网上很多朋友发的帖子很多并不是学习总结,只是对于Unity3D IDE的使用及一些API的罗列,或者是一些游戏Demo的完整教程。自己一直想从另一个角度来学习一下,也就是单纯从游戏的角度(我们常说的业务逻辑的角度),其实以前很多VC游戏教程都是这种思路,就是从一个很小的功能开始学,逐个知识点积累最后完成一个相对复杂完整的Demo程序。所以本文就从最小的让物体动起来开始。

说明

文章的视角基本着眼的是从简单到复杂功能的学习理解,所以是主要是基于2D的,也就是从Untiy2D开始,同时也会穿插一些3D部分,

所以最好使用具有Unity2D功能的Unity3D客户端,好像是4.3以后吧

效果图镇楼

需求描述和分析

本章的需求很简单,就是“通过在屏幕中点击鼠标,在2d视图中控制物体进行移动”。在别的平台和引擎中简直是Hello world级别的需求在Unity3d中却变得有些棘手了,主要有几个问题困扰着我,

1、IO输入是怎么样的;

2、鼠标事件是如何接收的;

3、移动动画是如何实现的;

“原理很简单,现实很残酷”,Unity3d的开放性造成了所谓的插件和库很多,显得凌乱。这里还是按照自己的惯性思维来了,按照别的平台的教程,

A、首先要有一个容器,

B、在容器上放置需要移动的精灵,

C、通过容器接收鼠标事件,

D、事件驱动精灵移动

这里UGui中采用容器的概念(或者我还不知道别的库也有),所以先在UGui中实现,

第一步,加一个Panel对象

第二步,导入一个精灵的图片资源

第三步,加一个2d的Image对象,设置其sprite为刚才导入的图片资源

第四步,给Panel对象绑定一个脚本,PanelController,

树结构

加图资源后

绑定代码

具体代码如下

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems; public class PanelController: MonoBehaviour , IPointerClickHandler
{
private Transform childPlayTransform;
private Transform parentCanvasTransform;
// Use this for initialization
void Start ()
{
//获得Image的Transform
childPlayTransform = transform.Find("Image");
parentCanvasTransform = transform.parent;
} // Update is called once per frame
void Update () { } public void OnPointerClick(PointerEventData eventData)
{
Debug.Log(string.Format("x:{0},y:{1}", eventData.position.x, eventData.position.y));
Debug.Log(string.Format("button x:{0},y:{1}", childPlayTransform.localPosition.x, childPlayTransform.localPosition.y)); Vector2 localPoint;
//在矩形范围内检测,全局鼠标点击点,到local点的转换
RectTransformUtility.ScreenPointToLocalPointInRectangle(transform as RectTransform, eventData.position,
eventData.enterEventCamera, out localPoint); childPlayTransform.localPosition = localPoint;
}
}

  

代码虽然少,但是核心的知识点就是世界坐标、相机坐标和局部坐标的转换也就是下面的这个函数

        //
// 摘要:
// Does the RectTransform contain the screen point as seen from the given camera?
//
// 参数:
// rect:
// The RectTransform to test with.
//
// screenPoint:
// The screen point to test.
//
// cam:
// The camera from which the test is performed from.
//
// 返回结果:
// True if the point is inside the rectangle.
public static bool RectangleContainsScreenPoint(RectTransform rect, Vector2 screenPoint, Camera cam);
public static bool ScreenPointToLocalPointInRectangle(RectTransform rect, Vector2 screenPoint, Camera cam, out Vector2 localPoint);

  

总结

虽然功能很少,但是也有几个知识点,一个是Unity3d的坐标系统,一个是坐标转换的基础知识,一个是Unity3d Gui的事件处理方式,特此记录。功能上有点小缺陷就是精灵的移动是瞬移的,也就是鼠标指到哪里移动到哪里(确实我也没有看出有什么不平滑),留到下篇继续吧。

源码

【Unity3D基础】让物体动起来①--UGUI鼠标点击移动的更多相关文章

  1. 【Unity3D基础】让物体动起来②--UGUI鼠标点击逐帧移动

    背景 上一篇通过鼠标移动的代码很简单,所以看的人也不多,但是还是要感谢“武装三藏”在博客园给出的评论和支持,希望他也能看到第二篇,其实可以很简单,而且是精灵自控制,关键是代码少是我喜欢的方式,也再次印 ...

  2. 时光煮雨 Unity3D让物体动起来③—UGUI DoTween&Unity Native2D实现

    本文首发蛮牛,次发博客园.接系列 第一篇,第二篇,本文为第三篇,再次感谢“武装三藏”在前两篇无私且精彩的问题解答 写在最前,时光煮雨,为了怀念 以下引用曾今读过的一些教程文章 其实这3种动画都有它特定 ...

  3. Unity3D鼠标点击物体产生事件

    如果需要处理鼠标点击物体的情况, 可以当数据接触物体时,鼠标手势改变,然后点击后和NPC产生对话等: using UnityEngine; using System.Collections; publ ...

  4. Unity3D基础学习 NGUI Example 7-Scroll View(Panel)制作固定包裹栏,点击传递参数显示物体

    最终效果如下: 实现ScrollView主要是NGUI的三个脚本"UIDraggable Panel","UIGrid","UIDrag Panel ...

  5. 【Unity3D基础教程】给初学者看的Unity教程(四):通过制作Flappy Bird了解Native 2D中的RigidBody2D和Collider2D

    作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程] ...

  6. Android开发 Unity3D基础 Android Development

    开发环境 Window 7 Unity3D 3.3.0 MB525 defy Android 2.1-update1 本次学习: 1.认识Unity 2.Unity3D环境搭建与Android软件生成 ...

  7. unity提高----------射线使用【unity3d 怎样获得当前鼠标点击的对象】

    unity3d 怎样获得当前鼠标点击的对象 最佳答案   var ray = Camera.main.ScreenPointToRay (Input.mousePosition);var hit : ...

  8. webgl学习总结画线面及场景和物体动

    WebGL是在浏览器中实现三维效果的一套规范.是浏览器中的3D引擎,是利用js代码来实现加载3D模型,渲染.输出等功能,从而实现在浏览器和微信中浏览三维文件的效果. three.js是基于WebGL的 ...

  9. Unity UGUI鼠标穿透UI问题(Unity官方的解决方法)

    简述 最近在用UGUI的时候遇到了鼠标穿透的问题,就是说在UGUI和3D场景混合的情况下,点击UI区域同时也会 触发3D中物体的鼠标事件.比如下图中 这里给Cube加了一个鼠标点击改变颜色的代码,如下 ...

随机推荐

  1. USACO 5.5 Picture(周长并)

    POJ最近做过的原题. /* ID: cuizhe LANG: C++ TASK: picture */ #include <cstdio> #include <cstring> ...

  2. 【JavaService】部署Java jar为Windows后台服务

    将Java jar文件部署为Windows后台服务有多种方法:Service Installer.Java service Wrapper.JavaService.exe等等.这里介绍下使用JavaS ...

  3. jquery插件之拖拽

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽效果,您可以根据自己的实际需求来设置被拖拽元素是否可 ...

  4. 读《深入php面向对象、模式与实践》有感(二)

    书中关于设计模式的介绍很详细. 一.单例模式 作者建了一个preferences类来解释什么是单例模式.这个preferences类并非我第一次见到,在android中也有这个类,不过以前都是只管用即 ...

  5. 一个xib钟多个Cell

    在实际开发中,有时候需要在一个xib钟拖几个cell,注意连线过程的object选择,不然出现没反应的现象. 例如: 在下图中,我在一个xib钟创建了五个cell,他们分别是:收货地址.订单信息.支付 ...

  6. ubuntu安装Python环境以及科学计算环境

    参考:http://blog.csdn.net/a1311543690/article/details/ 1.sudo apt-get install python-pip pip是Python的一个 ...

  7. php课程---JavaScript改变HTML中的元素

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Handler的总结

    Handler的总结 我们创建的Service.Activity,Broadcast均是一个主线程处理,即UI线程, 但是进行耗时操作时,比如I/O读写的大文件,数据库操作及网络下载需要很长的时间,为 ...

  9. java环境搭建系列:JDK从下载安装到简单使用

    最近,问的比较多的问题居然是jdk的问题,对于新手来说这确实有点难度,毕竟一个人经常上网浏览新闻和观看视频的人,一下子开始一门编程语言的环境搭建.这中间需要一个慢慢适应的过程.回想当初我在这个阶段也很 ...

  10. 【转】oracle回闪操作

    在9i上执行的操作 查询test表中记录select * from test;删除test表中记录delete from test;获得过去的会话exec dbms_flashback.disable ...