关于Unity中的小案例之运动的小船以及摄像机跟随技术(专题五)
实例步骤
1.创建Unity项目和文件目录,保存场景
场景搭建
2.导入美术做好的资源包(第68)
a: 导入地形资源包terrain.unitypackage,把里面的Map/Prefabs/Terrain预制体拖入场景;
b: 导入地形上的物体资源包Props.unitypackage,把里面的Map/Prefabs/Props 1预制体拖入场景;
c: 导入水特效资源包water.unitypackage,把里面的Standard Assets/Water (Basic)/Daylight Simple Water预制体拖入场景;
d: 导入人物角色资源包boss.unitypackage,把里面的Map/Boss预制体拖入场景;
e: 导入easyTouch摇杆资源包easy_touch.unitypackage,点击菜单的多出来的选项Hedgehog Team---->Easy Touch---->Add EasyTouch for C#,再点击Hedgehog Team---->Easy Touch---->Extensions---->Adding a new joystick;
摇杆的图片可以更换的,在New Joystick节点的Joystick textures组件里面更改
f: 每个物体障碍物都会加了一个碰撞器,这样船就不能穿过去了
3.调整摄像机的位置,使它在船的附近,可以看到船,快捷的方法是把摄像机先拖到船的节点下变成子节点,然后设置坐标(0,0,0),再调整到刚好看见船,调整完毕再移出子节点,就可以了。
4.船停在原地时候的波纹其实是一个粒子效果,在j节点Boss---->shake---->Rowing---->Waterdown---->Renderer---->Material---->water_sp1,以及材质的纹理贴图foam,使用的Shader是Particles/Additive

添加平移逻辑
5.创建一个脚本move控制船跟随摇杆的运动,挂载到船节点Boss下
a: 遥感控制汽船移动与调整方向;
b: y轴控制动力, x轴控制方向;
c: 将摇杆分成了4个区域,y < -0.5(向后) y > 0.5(向前); x < 0.5 x > 0.5(调整方向);
打开move.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class move : MonoBehaviour { public EasyJoystick joystick;//关联New joystick节点
private float speed = 5.0f;//1秒移动5米
private float w_speed = ;//8秒转一圈,1秒转45度
// Use this for initialization
void Start () { } // Update is called once per frame
void Update () { if (this.joystick.JoystickTouch.y < -0.5f) // 往后[-0.5, -1]
{
this.transform.Translate(, , -this.speed * Time.deltaTime);
}
else if (this.joystick.JoystickTouch.y > 0.5f) // 往前[0.5, 1]
{
this.transform.Translate(, , this.speed * Time.deltaTime);
} if (this.joystick.JoystickTouch.x < -0.5f)
{
this.transform.Rotate(, -this.w_speed * Time.deltaTime, );//绕自己的Y轴旋转,负为逆时针
}
else if (this.joystick.JoystickTouch.x > 0.5f)
{
this.transform.Rotate(, this.w_speed * Time.deltaTime, );//绕自己的Y轴旋转,正为顺时针
}
}
}
绕自己的Y轴旋转,逆时针为负,顺时针为正

汽船在水面的摇晃
6.模拟船的摇晃属于船的动画效果,该脚本不应该挂载在船的根节点Boss下,应该挂载在Boss的子节点shake下,专门模拟船的动画效果
a: 汽船绕z轴左右摇晃:
欧拉角: > 4度 && < 180,就要往回逆时针方向摆,< (360 - 4) && > 180;
b: 汽船绕x轴前后晃动
c: 欧拉角的范围[0, 360];顺时针为正,逆时针为负;
7.创建一个脚本shake控制船的摇晃,挂载到节点Boss/shake下
打开shake.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class shake : MonoBehaviour {
private float z_s_speed = 3.0f;//左右晃的角速度
private float x_s_speed = 2.0f;//前后晃的角速度 // Use this for initialization
void Start () { } // Update is called once per frame
void Update () {
// this.transform.eulerAngles是当前所转的欧拉角,欧拉角范围[0, 360]
if (this.transform.eulerAngles.z >= && this.transform.eulerAngles.z < )//大于4度,小于180度
{
this.z_s_speed = -this.z_s_speed;//超过范围,速度方向更改
}
else if (this.transform.eulerAngles.z > && this.transform.eulerAngles.z <= ( - ))//大于180度,小于(360-4)度
{
this.z_s_speed = -this.z_s_speed;//超过范围,速度方向更改
} if (this.transform.eulerAngles.x >= && this.transform.eulerAngles.x < )
{
this.x_s_speed = -this.x_s_speed;//超过范围,速度方向更改
}
else if (this.transform.eulerAngles.x > && this.transform.eulerAngles.x <= ( - ))
{
this.x_s_speed = -this.x_s_speed;//超过范围,速度方向更改
} this.transform.Rotate(this.x_s_speed * Time.deltaTime, , this.z_s_speed * Time.deltaTime);//绕z轴和绕x轴转
}
}
绕Z的旋转范围,绕X轴的是一样的,这里没放绕X轴的


摄像机跟随船移动
8..创建一个脚本camera_follow控制摄像机跟随船移动,挂载到主摄像机Main Camera节点下
a: 摄像机跟着汽船的位置,并距离物体后4米的位置;
b: 摄像机对准目标物体;
c: 将摄像机拉高1米对着汽船;
d: Quaternion.Euler, 欧拉角转四元数
打开camera_follow.cs
using UnityEngine;
using System.Collections; public class camera_follow : MonoBehaviour
{
public Transform target;//要跟随的目标的Transform组件,这里关联Boss/shake/Target
// Use this for initialization
void Start()
{ } // Update is called once per frame
void Update()
{
if (this.target == null)//如果跟随的目标不存在,就直接返回
{
return;
} // (1)摄像机移动到当前的物体所在的位置
this.transform.position = this.target.position; // (2)往后拉4米
Quaternion rot = Quaternion.Euler(, this.target.eulerAngles.y, );//欧拉角转四元素,旧的Quaternion.EulerAngles已经废弃,旧的表示的是弧度,不是角度
this.transform.position -= rot * Vector3.forward * ;//target的四元素旋转矩阵*摄像机自己的正Z方向=target的方向,target的方向*4=一个三维坐标向量 // (3)将摄像机抬高一米
Vector3 position = this.transform.position;
position.y += ;
this.transform.position = position; // (4) 摄像机对准某个物体,将自己的Z轴对准目标
this.transform.LookAt(this.target);
}
}
9.运行,摄像机就会跟着船运动了,还有一种直接把摄像机当作boss的子节点,也会跟着运动,但是那种不灵活。
关于Unity中的小案例之运动的小船以及摄像机跟随技术(专题五)的更多相关文章
- Hibernate中事务小案例
理论知识: 什么是事务? 指作为单个逻辑工作单位执行的一系列操作,要么完全的执行,要么完全不执行.事务处理可以确保非事务性单元内的所有操作都完全完成,否则永久不会更新面向数据的资源.通过将一组操作组合 ...
- js中的小案例(一)
效果图: html代码: <div id="date"> <p> <span id="prev">上一月</span& ...
- unity中实现静态的3D对象对其他对象的跟随
using UnityEngine; public class FollowPosition : MonoBehaviour { public Transform targetTrans; publi ...
- Unity中容易被忽略的小技巧
今天在游戏蛮牛上看到慕容小匹夫的一篇文章,感觉对自己现在的水平很实用,就给转载了过来,以便日后好温习一下. 这里还是要支持原创作者,原文地址在这里 一.编辑器染色 一个常见的工作情景是我们在调整场景内 ...
- DUBBO+Zookeeper在Centos7中本地搭建及小案例
环境: 1.centos7 2.jdk-7u76-linux-x64.tar.gz 2.tomcat:apache-tomcat-7.0.59.tar.gz 3.zookeeper-3.4.6.tar ...
- java 11-8 在大串中查找小串的案例
1.统计大串中小串出现的次数 举例: 在字符串"woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun& ...
- Unity中DoTween的使用
在Unity手游开发中,经常用到插值运算,我们可以使用Mathf.Lerp自行去实现效果,但是使用插件提高了我们的开发效率,这里归结一下DoTween的基本使用方式以及效果说明: 直接代码: usin ...
- 用体渲染的方法在Unity中渲染云(18/4/4更新)
github: https://github.com/yangrc1234/VolumeCloud 更新的内容在底部 最近在知乎上看到一篇文章讲云层的渲染(https://zhuanlan.zhihu ...
- 游戏的物理和数学:Unity中的弹道和移动目标提前量计算
下载地址:https://www.jianguoyun.com/p/DZPN6ocQ2siRBhihnx8 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺 ...
随机推荐
- HTML5 History API让ajax能回退到上一页
HTML5 History API提供了一种功能,能让开发人员在不刷新整个页面的情况下修改站点的URL.这个功能很有用,例如通过一段JavaScript代码局部加载页面的内容,你希望通过改变当前页面的 ...
- C# DateTime的 ParseExact和 TryParseExact 使用说明
最近需要把“20121010”转换为“2012-10-10”格式,直接用Convert.ToDateTime("20121010"),系统报错“未被识别的DateTime类型”. ...
- HTML5学习笔记(十八):闭包
高阶函数 JavaScript的函数其实都指向某个变量.既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,也可以返回一个函数,这种函数就称之为高阶函数. 函数作为参 ...
- git clean 小结
删除 一些 没有 Git add 的 文件: git clean 参数 -n 显示 将要 删除的 文件 和 目录 -f 删除 文件,-df 删除 文件 和 目录 git clean -n git c ...
- 无法加载 DLL“ParkCOM.dll”: 找不到指定的模块。 (异常来自 HRESULT:0x8007007E) 终结者
C#调用利用C++写的dll 常遇到的情况是无法加载DLL"***.dll":找不到指定的模块(异常来自HRESULT:0x8007007E)终极解决方法如下: 1.产生原因 可能 ...
- Sql Server 2008 清除日志
--在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式. USE [master] GO ALTER DATABASE SSCDZ SET RECOVERY SIMPLE ...
- 交叉编译环境以及开发板上-/bin/sh: ./hello: not found 转载自 http://blankboy.72pines.com
交叉编译环境以及开发板上-/bin/sh: ./hello: not found 目标板是S3C2440.至于交叉编译环境的搭建就不多说了,网上很多教程. 搭建好了交叉编译环境后,第一件事就是传说中的 ...
- [DIOCP3-说明书] 关于DEMO的编译
总有些朋友问我,关于DEMO编译的一些问题,每次都回答大概都差不多,我想还是写篇说明书给大家,关于DEMO编译的步骤. [环境设定] 1.将DIOCP3\source路径添加到Delphi的搜索路 ...
- asp.net正则匹配嵌套Html标签
废话不多说,直接代码 1.要匹配的html代码 <div class="conItem" id="footer"> <a id="g ...
- Asp.Net正则获取链接地址
string html = “html代码”; Regex reg = new Regex(@"(?is)<a[^>]*?href=(['""]?)(?< ...