接触U3D以来,我做过的场景漫游实现方式一般有以下几种:

  • Unity3d中的Animation组件,通过设置摄像机的关键点实现场景漫游
  • 第一人称或第三人称控制器
  • 编写摄像机控制脚本
  • iTween
iTween实现相对来说比较简单,而且动画效果非常好,因此是我做场景漫游的首选,下面我来总结一下iTween做场景漫游的具体实现

简单做了个小demo如图:



我在场景中建了4个空物体作为路径点,摄像机从一个路径点到下一个路径点循环往复,当按下空格键后,漫游会暂停,松开后继续,代码符合我一贯的风格,注释很详细,我就不多解释了.

涉及到的代码绑在摄像机上面,如下:

  1. using UnityEngine;
  2. using System.Collections;
  3. public class TweenRoam : MonoBehaviour
  4. {
  5. public Transform[] paths; //路径寻路中的所有的关键点 使用空物体路径点
  6. //public Vector3[] paths; //也可以使用这句代码直接给路径点的位置赋值
  7. public Hashtable args; //设置路径键值对
  8. public float m_speed = 10f; //漫游的速度
  9. public bool isMove = true; //是否漫游
  10. void Start()
  11. {
  12. args = new Hashtable();
  13. args.Add("path", paths); //设置路径的点
  14. args.Add("easeType", iTween.EaseType.linear); //设置类型为线性,线性效果会好一些。
  15. args.Add("speed", m_speed); //设置寻路的速度
  16. args.Add("movetopath", false); //是否先从原始位置走到路径中第一个点的位置
  17. args.Add("orienttopath", true);//是否让模型始终面朝当面目标的方向,拐弯的地方会自动旋转模型,如果你发现你的模型在寻路的时候始终都是一个方向那么一定要打开这个
  18. args.Add("looktarget", Vector3.zero); //移动过程中面朝一个点
  19. args.Add("loopType", "loop"); //三个循环类型 none loop pingpong(一般 循环 来回)
  20. args.Add("NamedValueColor", "_SpecColor"); //这个是处理颜色的。可以看源码的那个枚举。
  21. args.Add("delay", 0f); //延迟执行时间
  22. iTween.MoveTo(gameObject, args); //让模型开始寻路 这个方法和放在Update函数里的MoveUpdate()方法效果一样 Update里为了控制是否移动
  23. }
  24. void Update()
  25. {
  26. RoamControl();
  27. }
  28. /// <summary>
  29. /// 控制动画暂停和继续的函数
  30. /// </summary>
  31. void RoamControl()
  32. {
  33. if (Input.GetKeyDown(KeyCode.Space))
  34. {
  35. iTween.Pause();
  36. }
  37. if (Input.GetKeyUp(KeyCode.Space))
  38. {
  39. iTween.Resume();
  40. }
  41. }
  42. void OnDrawGizmos()
  43. {
  44. //在Scene视图中绘制出路径
  45. iTween.DrawLine(paths, Color.yellow);
  46. iTween.DrawPath(paths, Color.red);
  47. }
  48. }

Demo源码地址: http://pan.baidu.com/s/1jIulQpo

注意:代码绑定到摄像机上后要给paths指定路径,或者用vector那句直接赋值也可以

关于iTween的其他知识点

  • iTween.MoveTo(): 让模型移动到一个位置,它的底层函数是通过动态的修改模型每一帧的transform.position完成的,所以它会百分之百到达目标点,不会出现误差。

  • iTween.MoveFrom():它和上面的一样,iTween.MoveTo()是将模型移动到目标位置,而iTween.MoveFrom()是将模型从目标位置移动到原始位置。

  • iTween.MoveAdd() 和iTween.MoveBy()底层实现一样,大家可以去看源码。处理移动时采用的是transform.Translate也就是API的平移,这样在处理移动的时候可能会出现一些误差,但是效果好点。

  • iTween.MoveUpdate():和iTween.MoveTo()差不多,只是它需要放在循环或者Update()中。

  • iTween.Pause(); 暂停

  • iTween.Resume();恢复

Unity3d场景漫游---iTween实现的更多相关文章

  1. 基于SketchUp和Unity3D的虚拟场景漫游和场景互动

    这是上学期的一次课程作业,难度不高但是也一并记录下来,偷懒地拿课程报告改改发上来. 课程要求:使用sketchUp建模,在Unity3D中实现场景漫游和场景互动. 知识点:建模.官方第一人称控制器.网 ...

  2. Unity3d 简单的小球沿贝塞尔曲线运动(适合场景漫游使用)

        简单的小球沿贝塞尔曲线运动,适合场景漫游使用 贝塞尔曲线:(贝塞尔曲线的基本想法部分摘自http://blog.csdn.net/u010019717/article/details/4768 ...

  3. 【Unity入门】场景编辑与场景漫游快捷键

    版权声明:本文为博主原创文章,转载请注明出处. 打开Unity主窗口,选择顶部菜单栏的“GameObject”->“3D Object”->“Plane”在游戏场景里面添加一个面板对象.然 ...

  4. Unity3d场景合并

    Unity3d场景合并 一.Unity3d场景合并,有一次的情况是这样的,就是我们是每个人都在开发,每个人有不同的场景,那么合并的时候,有些会出问题,那么我有一个好的方案,就是首先弄一个公共的资源库, ...

  5. OSG实现场景漫游(转载)

    OSG实现场景漫游 下面的代码将可以实现场景模型的导入,然后在里面任意行走,于此同时还实现了碰撞检测. 源代码下载地址: /* * File : Travel.cpp * Description : ...

  6. 【转】Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)

    本篇文章主要介绍了"Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)",主要涉及到Unity3D 场景切换与持久化简单数据储存(PlayerPrefs类)方 ...

  7. 全景视频外包团队:技术分享Unity3D全景漫游

    作者:未知 1.建模中使用的图片.文件.文件夹等以及模型中物体.材质等的名称都不能使用中文或者特殊符号,可以使用英文字母.数字.下划线等 2.调整Max的单位为米 3.烘培光影的设置 4.模型的中的植 ...

  8. unity3d 场景间数据传递

    在游戏项目中,常常会使用到用户信息,获取信息当然可以从数据库中获取.但是对场景多的游戏这样做是不正确的,那么我我们就需要再第一次获取用户信息之后, 同时在其它的场景中共享用户数据,避免对服务器增加负担 ...

  9. Unity3D 场景切换加载进度条实现

    需要三个场景,场景A,场景B,场景C: 场景A:一个按钮,点击加载场景B: 场景B:从A切换到C过度场景,加载进度条: 场景C:目标场景: 创建OnProgress.cs脚本: using Syste ...

随机推荐

  1. ASP.NET MVC TempData使用心得

    说明: 在ASP.NET MVC中資料傳遞主要有ViewData與TempData ViewData主要是Controller傳遞Data給View,存留期只有一個Action,要跨Action要使用 ...

  2. Adapter接口及实现类

    Adapter本身只是一个接口,它派生了ListAdapter和SpinnerAdapter两个子接口,其中ListAdapter为AbsListView提供列表项,而SpinnerAdapter为A ...

  3. Cookie的一些用法

    Cookie的一些用法: package com.stono.servlet.listenerorder; import java.io.IOException; import java.io.Pri ...

  4. MyBatis 一对一关联查询

    xml文件: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC & ...

  5. oracle与sqlserver利用函数生成年月日加流水号

    最近在做oracle相关的项目,刚接触oracle,与sqlserver语法上还是有区别的 sqlserver : 示例:FX+当前年月日+00001 如下图流水号实力所示 原理: 首先 'FX'是固 ...

  6. Linux笔记(十四) - 日志管理

    (1)rsyslogd的服务:查看服务是否启动:ps aux | grep rsyslogd 查看服务是否自启动:chkconfig --list | grep rsyslog 配置文件 : /etc ...

  7. 如何使用DockerHub官方的mysql镜像

    Mysql是一个广泛使用的开源关系型数据库. 如何获取Mysql Docker镜像? docker pull mysql:5.7 如何使用这个Docker镜像? 1.启动一个Mysql Server容 ...

  8. GitLab Wiki 内容恢复版本管理

    原来一直在网站上写Wiki文档, 最近手欠误删一篇文档, 想要恢复文档时才发现原来gitlab的Wiki是用git管理的从此再也不用为误删担心了 实现步骤: mac系统安装gollow brew in ...

  9. linux上安装Oracle 11g R2 标准版 64位

    一.Oracle 安装前的准备 检查一下包,必须全部安装: binutils-2.20.51.0.2-5.43.el6.x86_64 compat-libstdc++-296-2.96-144.el6 ...

  10. java 非缓冲与缓冲数据读取比较

    首先不适用缓存技术,读取数据: //非缓冲计时 package com.swust; import java.io.*; /* *功能:创建一个程序,写10000个随机双精度的数到一个文件中,同时测试 ...