【Unity3D基础】让物体动起来①--UGUI鼠标点击移动

背景

首先还是先声明自己是比较笨的一个人,总是找不到高效的学习方法,目前自己学习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的事件处理方式,特此记录。功能上有点小缺陷就是精灵的移动是瞬移的,也就是鼠标指到哪里移动到哪里(确实我也没有看出有什么不平滑),留到下篇继续吧。

源码

时间: 2024-08-06 22:20:42

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

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

背景 上一篇通过鼠标移动的代码很简单,所以看的人也不多,但是还是要感谢“武装三藏”在博客园给出的评论和支持,希望他也能看到第二篇,其实可以很简单,而且是精灵自控制,关键是代码少是我喜欢的方式,也再次印证了Unity3d的复杂性(同样的功能多次封装),代码如下: public class DebugTest : MonoBehaviour { RectTransform m_Rect; void Start () { m_Rect = GetComponent<RectTransform>();

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

本文首发蛮牛,次发博客园.接系列 第一篇,第二篇,本文为第三篇,再次感谢“武装三藏”在前两篇无私且精彩的问题解答 写在最前,时光煮雨,为了怀念 以下引用曾今读过的一些教程文章 其实这3种动画都有它特定的使用场合. 第一种动画适合创建简单的对象位移及直接性质的属性更改(在后面的教程中,我还将更深入的挖掘Storyboard动画的潜力,动态创建更复杂的基于KeyFrame的关键帧动画). 第二种动画适合全局属性的时时更改,例如我们后面要讲到的敌人或NPC以及地图等全体性的相对位移及属性更改时就要用到

Pygame中鼠标点击之后,物体逐渐移动到鼠标点击坐标的方法

1 import pygame 2 from pygame.locals import * 3 from pygame.math import * 4 import sys 5 6 pygame.init() 7 size = width, height = 1600, 900 8 screen = pygame.display.set_mode(size) 9 color = (0, 0, 0) # 设置颜色 10 ball = pygame.image.load('dabai_new.gif

css基础 outline:none 取消input的 鼠标点击时蓝色的框框 效果

礼悟:    公恒学思合行悟,尊师重道存感恩.叶见寻根三返一,江河湖海同一体.          虚怀若谷良心主,愿行无悔给最苦.读书锻炼养身心,诚劝且行且珍惜.              ide:visual studio 2017             browser:Chrome                     os:win7 代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8&qu

Unity3D基础教程】(四):通过制作Flappy Bird了解Native 2D...

[狗刨学习网] 引子 在第一篇文章[Unity3D基础教程]给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics我已经讲过了一些关于刚体和碰撞的关系,这次我们就通过Flappy Bird这个事例来讲解一下刚体和碰撞体在游戏中的具体应用.相关代码可以参考Flappy Bird的源码. 认识RigidBody 当RigidBody2D的质量属性被设置为0时,刚体的质量变为无限大,此时刚体相当于静态刚体,永远一动不动.但是在Unity中你是无法

【Unity3D基础教程】给初学者看的Unity教程(三):通过制作Flappy Bird了解Native 2D中的Sprite,Animation

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 上一次我们讲了MonoBehaviour的前世今生,了解了游戏中的每一个GameObjec都是由脚本控制的,这一次我们开始将Unity中Native 2D中的Sprite,并且使用Animation来让Sprite动起来. 在接下来的几篇博客里,我会通过做一个Flappy Bird来讲解Unity中各个组件的使用,项目的源代码在这里:U

Android开发 Unity3D基础 Android Development

开发环境 Window 7 Unity3D 3.3.0 MB525 defy Android 2.1-update1 本次学习: 1.认识Unity 2.Unity3D环境搭建与Android软件生成 3.Unity3D基本使用方法 1.认识Unity3D Unity3D是一个让开发者能够在多平台制作同一款游戏的游戏开发工具,有专业的图像处理和游戏引擎,能做出各式各样的游戏. 羽化以前认为Android游戏开发只能在Eclipse里面死活敲代码,也许是自己阅历不够,不知道游戏引擎能给游戏开发带来

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

作者:王选易,出处:http://www.cnblogs.com/neverdie/ 欢迎转载,也请保留这段声明.如果你喜欢这篇文章,请点[推荐].谢谢! 引子 在第一篇文章[Unity3D基础教程]给初学者看的Unity教程(一):GameObject,Compoent,Time,Input,Physics我已经讲过了一些关于刚体和碰撞的关系,这次我们就通过Flappy Bird这个事例来讲解一下刚体和碰撞体在游戏中的具体应用.相关代码可以参考Flappy Bird的源码. 认识RigidBo

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因

unity3d中的物体,在Scene窗口中可以看到,而在Game窗口中看不到的原因: 多半是因为物体所属Layer与照相机的culling mask不一致导致的,或者超出照相机的可视范围. 如果游戏中有多个相机,每个相机都有自己的可视范围和culling mask,物体在移动的过程中,进入不同的相机,其可见性可能是变化的,取决与物体所属Layer与当前相机是否一致