u3d人如何在素描方块体体上行走

u3d 按照路径不停的运动
u3d 按照路径不停的运动
使用第三方插件Curvy为unity场景快速生成运动轨迹与赛道
Unity3D脚本:按路径移动
令物体沿着指定路径运动[as3版]
Unity3d 简单的按照路径移动物体!
没有更多推荐了,游戏蛮牛学习群(纯技术交流,不闲聊):
扫一扫,访问微社区
后使用快捷导航没有帐号?
签到成功!您今天第{todayrank}个签到,签到排名竞争激烈,记得每天都来签到哦!已连续签到:{constant}天,累计签到:{days}天
关注:1480
当前位置: &
本站内容来自互联网,仅用于学习,禁止商用,请支持正版。
版权归作者所有,如果侵犯您的权益请联系我们,联系本站删除。
请大家上传的时候尽量使用.unitypackage的形式
查看: 2259|回复: 42
Q版Unity酱+低面城市场景+方块人(玩家、僵尸)
2133/150排名<font color="#FF昨日变化9主题帖子积分
初来乍到, 积分 133, 距离下一级还需 17 积分
初来乍到, 积分 133, 距离下一级还需 17 积分
在线时间46 小时
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
才可以下载或查看,没有帐号?
资源为资源包,unity酱带表情和动画,方块人带动画和武器。
(48.93 KB, 下载次数: 9)
14:17 上传
(139.12 KB, 下载次数: 11)
14:17 上传
(197.34 KB, 下载次数: 12)
14:18 上传
(109.15 KB, 下载次数: 16)
14:18 上传
组图打开中,请稍候......
14:19 上传
点击文件名下载附件
49 Bytes, 下载次数: 249
售价: 5 蛮牛币 &[]
post_newreply
每日推荐:
74639/5000排名76昨日变化主题帖子积分
日久生情, 积分 4639, 距离下一级还需 361 积分
日久生情, 积分 4639, 距离下一级还需 361 积分
蛮牛币4806
在线时间1657 小时
Unity酱好可爱
每日推荐:
72535/5000排名<font color="#FF昨日变化6主题帖子积分
日久生情, 积分 2535, 距离下一级还需 2465 积分
日久生情, 积分 2535, 距离下一级还需 2465 积分
蛮牛币10199
在线时间362 小时
来自Mobile---
每日推荐:
73099/5000排名<font color="#FF昨日变化20主题帖子积分
日久生情, 积分 3099, 距离下一级还需 1901 积分
日久生情, 积分 3099, 距离下一级还需 1901 积分
蛮牛币2460
在线时间451 小时
每日推荐:
5717/1000排名<font color="#FF昨日变化20主题帖子积分
熟悉之中, 积分 717, 距离下一级还需 283 积分
熟悉之中, 积分 717, 距离下一级还需 283 积分
蛮牛币3523
在线时间238 小时
每日推荐:
3268/300排名<font color="#FF昨日变化8主题帖子积分
偶尔光临, 积分 268, 距离下一级还需 32 积分
偶尔光临, 积分 268, 距离下一级还需 32 积分
在线时间71 小时
楼主给力,赞一个。。。。。
每日推荐:
145/50排名<font color="#FF昨日变化10主题帖子积分
注册看看, 积分 45, 距离下一级还需 5 积分
注册看看, 积分 45, 距离下一级还需 5 积分
在线时间24 小时
谢谢分享!
每日推荐:
71866/5000排名<font color="#FF昨日变化2主题帖子积分
日久生情, 积分 1866, 距离下一级还需 3134 积分
日久生情, 积分 1866, 距离下一级还需 3134 积分
在线时间507 小时
每日推荐:
61359/1500排名<font color="#FF昨日变化6主题帖子积分
蛮牛粉丝, 积分 1359, 距离下一级还需 141 积分
蛮牛粉丝, 积分 1359, 距离下一级还需 141 积分
蛮牛币2226
在线时间271 小时
每日推荐:
73162/5000排名<font color="#FF昨日变化1主题帖子积分
日久生情, 积分 3162, 距离下一级还需 1838 积分
日久生情, 积分 3162, 距离下一级还需 1838 积分
在线时间1058 小时
[]: 一个袋子砸在了 U3DS 头上,U3DS 赚了 1
每日推荐:
2117/150排名<font color="#FF昨日变化9主题帖子积分
初来乍到, 积分 117, 距离下一级还需 33 积分
初来乍到, 积分 117, 距离下一级还需 33 积分
在线时间32 小时
U酱萌我一脸血
每日推荐:
71902/5000排名<font color="#FF昨日变化20主题帖子积分
日久生情, 积分 1902, 距离下一级还需 3098 积分
日久生情, 积分 1902, 距离下一级还需 3098 积分
蛮牛币3179
在线时间255 小时
不错不错,很萌。
每日推荐:
2132/150排名<font color="#FF昨日变化9主题帖子积分
初来乍到, 积分 132, 距离下一级还需 18 积分
初来乍到, 积分 132, 距离下一级还需 18 积分
在线时间37 小时
感谢楼主分享
每日推荐:
120/50排名<font color="#FF昨日变化30主题帖子积分
注册看看, 积分 20, 距离下一级还需 30 积分
注册看看, 积分 20, 距离下一级还需 30 积分
在线时间15 小时
可爱啊~~~~~~~~~~~
每日推荐:
3169/300排名<font color="#FF昨日变化12主题帖子积分
偶尔光临, 积分 169, 距离下一级还需 131 积分
偶尔光临, 积分 169, 距离下一级还需 131 积分
在线时间57 小时
看见你的素材我就萌新了一个想法,谢谢
每日推荐:
连续签到30天posts - 2,&
comments - 2,&
trackbacks - 0
算法简介:
  A*搜寻算法俗称A星算法。A*算法是比较流行的启发式搜索算法之一,被广泛应用于路径优化领域[。它的独特之处是检查最短路径中每个可能的节点时引入了全局信息,对当前节点距终点的距离做出估计,并作为评价该节点处于最短路线上的可能性的量度。[1]&- 百度百科
  通俗点说,就是在起点与目标点之中找出一条可通行的最短路线。常见于各类RPG游戏中的自动寻路功能:点击某个任务,人物会自动移动过去;点击地图上某个点,人物也会照着显示出来(或者隐藏了)的路线前进。玩过LoL,红色警戒等类似游戏的小伙伴都知道,右击小地图的某一处,小地图会出现一条从当前位置到所点击位置的红色路线,然后英雄就会随着这条路线一直走到目标点。这种功能,就是A*算法的在游戏中的常见应用之处。
算法原理:
  详情见 :
本篇目的:
  运用A*算法在U3D中实现简单的自动寻路功能:鼠标点击地图上某处,人物根据A*算法计算出来的路线移动到点击处。
效果展示:
  第一次弄gif图,视频也没有录好:文件太大,镜头远近切换太快;导进ps时帧数就很长,然后帧数选少点后,因为整个视频抖动太大,所以看起来就会非常突兀。然后在我的“努力”加工下,就成上面这样了,嘿嘿嘿,是不是丑的不要不要的??。
  估计大家也看不懂,我解释一遍:场景中白色方块就是障碍物,不能穿过的。播放中出现的一条红色的线就是在鼠标点击某处后,A*算法计算出来的从玩家当前点到鼠标点击的点的移动路径。红线上有一个蓝色物体(反正就是一个在移动的物体),那个就是玩家在沿着移动路径往目标点(鼠标点击处)移动。
场景布置:
  1 布置地面:场景中新建一个Plane(地面)重置一下Transform,然后将Scale拉伸至20倍(此时地面的大小是200x200),地面是不带y坐标的,即只有xz平面,此时平面上左下角坐标点是(-100,-100),右上角是(100,100)这个很重要,后面的判断坐标点是否越界(超出地面范围)就是依据这个地面的大小和坐标
  2&布置障碍物:新建一个空物体Bars,在Bars下创建一个cube,将cube随便拉伸做成一堵墙,然后复制,摆放到场景上各个位置。
  3 创建玩家:场景中新建一个Capsule(为了好控制,就选用胶囊体了),取名为Player,为它挂上Character Controller角色控制器。
  4 路线:新建一个Sphere球,涂成红色,改名叫Way,卸载掉Collider(一定要卸载),做成预制体,用来表示计算出来的路线上的每一点。新建一个空物体Ways,用来存储路线
  5 层级设置:为了代码中好检测,为地面Plane设立一个单独的层Plane,层级号位9.所有障碍物层级为Bars,层级号为8&
  布置好后就跟下面差不多了:
脚本编辑:
  脚本没写的太过复杂,就编写了两个脚本:
    PlayerCtrl.cs   用来控制玩家移动
    AStarRun.cs  用A*算法来计算起点到目标点的最佳路径并返回
    将这两个脚本都挂载在玩家上(Player)
PlayerCtrl.cs 用来控制玩家移动
using UnityE
using System.C
//玩家控制器
public class PlayerCtrl : MonoBehaviour {
public GameObject wayL//寻路线的红点
public float moveSpeed = 10f;//角色前进速度
private CharacterC//角色控制器
private Transform waysP//寻路线的放置位置
private R//射线检测鼠标点击点
private RaycastH
private bool IsMove = false;//是否正在寻路过程
void Start ()
cc = GetComponent&CharacterController&();
waysParent = GameObject.Find("Ways").
void Update ()
//鼠标单击移动
if(Input.GetMouseButtonDown(<span style="color: #))
ray = Camera.main.ScreenPointToRay(Input.mousePosition);//获取主相机到鼠标点击点的射线
//检测射线是否碰撞到地面:地面的层级是9
if(Physics.Raycast(ray,out hit,<span style="color: # && <span style="color: #))
//往目标点移动过去
Vector3 starPoint = new Vector3(transform.position.x,<span style="color: #,transform.position.z);//寻路的起点
Vector3 targetPoint = new Vector3(hit.point.x,<span style="color: #,hit.point.z);//寻路的终点
if(!IsMove)
StartCoroutine(AutoMove(starPoint,targetPoint));//开启自动寻路
/// &summary&
/// 自动寻路协程
/// &/summary&
/// &returns&The move.&/returns&
/// &param name="starPoint"&起点.&/param&
/// &param name="targetPoint"&目标点.&/param&
IEnumerator AutoMove(Vector3 starPoint,Vector3 targetPoint)
IsMove = true;
yield return new WaitForFixedUpdate();
//运用A星算法计算出到起点到目标点的最佳路径
Vector3[] ways = GetComponent&AStarRun&().AStarFindWay(starPoint,targetPoint);
if(ways.Length == <span style="color: #)
IsMove = false;
yield break;
//打印显示出寻路线
foreach(var v in ways)
GameObject way = Instantiate&GameObject&(wayLook);
way.transform.parent = waysP
way.transform.localPosition =
way.transform.rotation = Quaternion.
way.transform.localScale = Vector3.
//让玩家开始沿着寻路线移动
int i = <span style="color: #;
Vector3 target = new Vector3(ways[i].x,transform.position.y,ways[i].z);
transform.LookAt(target);
while(true)
yield return new WaitForFixedUpdate();
Debug.Log("run run run !!!");
cc.SimpleMove(transform.forward * moveSpeed * Time.deltaTime);
if(Vector3.Distance(transform.position,target) & 1f)
Debug.Log("run is ok !!!");
if(i &= ways.Length)
target = new Vector3(ways[i].x,transform.position.y,ways[i].z);
transform.LookAt(target);
//移动完毕,删除移动路径
for(int child = waysParent.childCount - <span style="color: #;child &= <span style="color: #;--child)
Destroy(waysParent.GetChild(child).gameObject);
//等待执行下一次自动寻路
IsMove = false;
AStarRun.cs  用A*算法来计算起点到目标点的最佳路径并返回
using UnityE
using System.C
using System.Collections.G
public class AStarRun : MonoBehaviour {
private Map map = new Map();//格子地图
////开启列表
private List&MapPoint& open_List = new List&MapPoint&();
//关闭列表
private List&MapPoint& close_List = new List&MapPoint&();
//定义一个路径数组
private ArrayList way = new ArrayList();
//判断某点是否在开启列表中
private bool IsInOpenList(int x,int z)
foreach(var v in open_List)
if(v.x == x && v.z == z)
return true;
return false;
//判断某点是否在关闭列表中
private bool IsInCloseList(int x,int z)
foreach(var v in close_List)
if(v.x == x && v.z == z)
return true;
return false;
//从开启列表中找到那个F值最小的格子
private MapPoint FindMinFInOpenList()
MapPoint minPoint = null;
foreach(var v in open_List)
if(minPoint == null || minPoint.GetF & v.GetF)
minPoint =
return minP
//从开启列表中找到格子
private MapPoint FindInOpenList(int x,int z)
foreach(var v in open_List)
if(v.x == x && v.z == z)
return null;
/// &summary&
/// a星算法寻路
/// &/summary&
/// &returns&寻到的路结果.&/returns&
/// &param name="starPoint"&起点
/// &param name="targetPoint"&终点&/param&
public Vector3[] AStarFindWay(Vector3 starPoint,Vector3 targetPoint)
//清空容器
way.Clear();
open_List.Clear();
close_List.Clear();
//初始化起点格子
MapPoint starMapPoint = new MapPoint();
starMapPoint.x = (int)starPoint.x;
starMapPoint.z = (int)starPoint.z;
//初始化终点格子
MapPoint targetMapPoint = new MapPoint();
targetMapPoint.x = (int)targetPoint.x;
targetMapPoint.z = (int)targetPoint.z;
//将起点格子添加到开启列表中
open_List.Add(starMapPoint);
//寻找最佳路径
//当目标点不在打开路径中时或者打开列表为空时循环执行
while(!IsInOpenList(targetMapPoint.x,targetMapPoint.z) || open_List.Count == <span style="color: #)
//从开启列表中找到那个F值最小的格子
MapPoint minPoint = FindMinFInOpenList();
if(minPoint == null)
return null;
//将该点从开启列表中删除,同时添加到关闭列表中
open_List.Remove(minPoint);
close_List.Add(minPoint);
//检查改点周边的格子
CheckPerPointWithMap(minPoint,targetMapPoint);
//在开启列表中找到终点
MapPoint endPoint = FindInOpenList(targetMapPoint.x,targetMapPoint.z);
Vector3 everyWay = new Vector3(endPoint.x,<span style="color: #,endPoint.z);//保存单个路径点
way.Add(everyWay);//添加到路径数组中
//遍历终点,找到每一个父节点:即寻到的路
while(endPoint.fatherPoint != null)
everyWay.x = endPoint.fatherPoint.x;
everyWay.z = endPoint.fatherPoint.z;
everyWay.y = <span style="color: #;
way.Add(everyWay);
endPoint = endPoint.fatherP
//将路径数组从倒序变成正序并返回
Vector3[] ways = new Vector3[way.Count];
for(int i = way.Count - <span style="color: #;i &= <span style="color: #;--i)
ways[way.Count - i - <span style="color: #] = (Vector3)way[i];
//清空容器
way.Clear();
open_List.Clear();
close_List.Clear();
//返回正序的路径数组
//判断地图上某个坐标点是不是障碍点
private bool IsBar(int x,int z)
//判断地图上某个坐标点是不是障碍点
Vector3 p = new Vector3(x,<span style="color: #,z);
//检测该点周边是否有障碍物
//障碍物层级为8
Collider[] colliders = Physics.OverlapSphere(p,<span style="color: #,<span style="color: # && <span style="color: #);
if(colliders.Length & <span style="color: #)
return true;//有障碍物,说明该点不可通过,是障碍物点
return false;
//计算某方块的G值
public int GetG(MapPoint p)
if(p.fatherPoint == null)
return <span style="color: #;
if(p.x == p.fatherPoint.x || p.z == p.fatherPoint.z)
return p.fatherPoint.G + <span style="color: #;
return p.fatherPoint.G + <span style="color: #;
//计算某方块的H值
public int GetH(MapPoint p,MapPoint targetPoint)
return (Mathf.Abs(targetPoint.x - p.x) + Mathf.Abs(targetPoint.z - p.z)) * <span style="color: #;
//检查某点周边的格子
private void CheckPerPointWithMap(MapPoint _point,MapPoint targetPoint)
for(int i = _point.x-<span style="color: #; i &= _point.x + <span style="color: #;++i)
for(int j = _point.z - <span style="color: #; j &= _point.z + <span style="color: #; ++j)
//剔除超过地图的点
if(i & map.star_X || i & map.end_X || j & map.star_Z || j & map.end_Z)
//剔除该点是障碍点:即周围有墙的点
if(IsBar(i,j))
//剔除已经存在关闭列表或者本身点
if(IsInCloseList(i,j) || (i == _point.x && j == _point.z))
//剩下的就是没有判断过的点了
if(IsInOpenList(i,j))
//如果该点在开启列表中
//找到该点
MapPoint point = FindInOpenList(i,j);
int G = <span style="color: #;
//计算出该点新的移动代价
if(point.x == _point.x || point.z == _point.z)
G = point.G + <span style="color: #;
G = point.G + <span style="color: #;
//如果该点的新G值比前一次小
if(G & point.G)
//更新新的G点
point.G = G;
point.fatherPoint = _
//如果该点不在开启列表内
//初始化该点,并将该点添加到开启列表中
MapPoint newPoint = new MapPoint();
newPoint.x =
newPoint.z =
newPoint.fatherPoint = _
//计算该点的G值和H值并赋值
newPoint.G = GetG(newPoint);
newPoint.H = GetH(newPoint,targetPoint);
//将初始化完毕的格子添加到开启列表中
open_List.Add(newPoint);
public class Map
public int star_X;// 横坐标起点
public int star_Z;// 纵坐标起点
public int end_X;// 横坐标终点
public int end_Z;//纵坐标终点
public Map()
star_X = - <span style="color: #0;
star_Z = - <span style="color: #0;
<span style="color: #0;
<span style="color: #0;
//每一个格子的信息
public class MapPoint
//F = G + H
从起点A移动到指定方格的移动代价,父格子到本格子代价:直线为10,斜线为14
使用 Manhattan 计算方法,
计算(当前方格到目标方格的横线上+竖线上所经过的方格数)* 10
public int//格子的x坐标
public int//格子的z坐标
public int G;
public int H;
public int GetF{
return G + H;
public MapPoint fatherP//父格子
public MapPoint(){}
public MapPoint(int _x,int _z,int _G,int _H,MapPoint _fatherPoint)
this.x = _x;
this.z = _z;
this.G = _G;
this.H = _H;
this.fatherPoint = _fatherP
&  至此,一个简单的自动寻路就完成了。代码逻辑感谢 园友&&分享的 &此篇正是在学习他的逻辑基础上完成的,特别感谢。
阅读(...) 评论()u3d快速入门图文教程
u3d快速入门图文教程
开始学U3D,入门是比难的,首先要了解U3D最重要的五大界面,第一:场景(Sence),构建游戏的地方;第二:层级(Hierarchy),场景中的游戏对象都列在这里。第三:检测面板(Inspector),当前选中的资源或对象的设置,是一些变量和组件的集合。第四:游戏(Game),演示窗口,仅在播放模式中演示。第五:项目
(Project),一些资源的列表,和库的概念一样。
然后了解主菜单栏的八大菜单:文件(File),编辑(Edit),资源(Assets),游戏对象(GameObject),组件(Component),地形(Terrain),窗口(Window),帮助(Help),熟悉这些菜单每一个命令对以后的游戏制作大有帮助。
在U3D中,一定要对坐标(Coordinates)有个了解,U3D的坐标点是以(x,y,z)的顺序排列的,切记。熟悉坐标,在做游戏的过程中会更加顺手。
如果你没有任何编程基础,一样可以学习Javascript(或C#这些都行),我学AS的时候也完全不懂编程。先学Javascript语言也无妨,因为这个引擎主要是个编程工具。打开Script帮助文档和Monodevelop编写器,从最简单的位移(transform.Translate)开始吧。
Unity3D的基本操作很容易就能掌握了,接下来就是游戏系统的核心部分:脚本。
什么是Script(脚本)?简而言之,就是使用代码来执行一系列动作命令的特殊文本,它需要编译器来从新解读。U3D内部如何解读脚本,这不是我们所要关心的—这是引擎开发人员的活,我们所要知道的就是脚本的使用规则。
【三种语言的特点】
U3D支持C#,JavaScript,BOO三种语言格式的代码编写。首先来简单介绍下这三种语言的特点:
对U3D来说,这是入门级的脚本语言,U3D内置的函数都能通过JS方便的调用。语法上,JS和传统的差不多,需要分号结束符,变量类型定义,大括号……不过它的变量类型定义,是通过冒号接在变量右边,如:Name:string=”Li”。相对其他两种语言,使用JS语法,很多函数不需要实例化就能直接使用,如:
vector3 direction=vector3(1,2,3)。如果使用C#,则需要使用new关键字:vector3 direction=new vector3(1,2,3)。JavaScript直接继承自U3D的MonoBehaviour类,因此不像C#和BOO那样需要使用Using或Import来加载类库。这看似省心,不过因为缺少了加载特殊类库,JavaScript能调用的第三方函数不多(当然,我们可以载入net类库给JavaScript调用,虽然看着有点奇怪……)。
*注意:JavaScript不是Java,同时,U3D中的JavaScript也有别于独立的JavaScript语言。
C#(发音C Sharp),微软开发的面向对象编程语言。由于有强大的net类库支持,以及由此衍生出的很多跨平台语言,C#逐渐成为U3D开发者推崇的程序语言。U3D内置的脚本范例中,C#脚本也占了很大一部分(其他脚本是JavaScript脚本)。另外,在装有VisualStudio的电脑上,我们也可以使用微软的脚本编辑工具来编写U3D脚本。C开头,那么语法上和C语言是很接近的,除了面向对象语言所具有的一些特点。当然,我不用在这进行太多说明,因为C#的相关学习资料很多。
BOO是新兴的基于Python的语言。语法上,BOO和Python大同小异,都是通过换行来实现语句的结束,它省略了分号、大括号,甚至条件语句的小括号等。Python在很多大型三维图形软件上都有应用,由此可以看出它的跨平台性能很不错,我也选择使用Python来编写maya特效脚本;不过,对于游戏事件的编写,个人感到这种精简的语法反而有些难以适应。如基本的变量类型定义,BOO(类Python)语法就显得不那么便捷: direction as vector3 =vector3(1,2,3)。游戏事件不同于特效脚本,前者是过程中的交互,而后者只需要看到结果。因此,游戏中经常需要大量的具有明确类型的变量出现,BOO语言可以省略变量类型的优势在这里反而容易引发问题。
引擎编译时,三种语言的执行效率是一样的,因为U3D会内部进行它自己的语言格式的转换。尽管我们可以在不同语言编写的脚本之间进行变量和方法的调用,但是我不推荐那么做,因为测试确实会存在一些意想不到的问题。使用不同语言编写多个脚本时,应尽量让脚本之间没有直接联系。
最后,个人认为,在windows平台下,C#是U3D脚本语言的最佳选择。
【脚本的使用规则】
U3D的脚本作用方式很有趣,我称之为“拖放法”。无论是作用在一个具体的场景物体还是管理着批量的物体,脚本首先必须依附于场景中的一个元素才能被执行。要将脚本赋予物体的方式很简单,就是按住鼠标左键将脚本文件拖放到物体的属性面板上(也可以拖放到场景的物体上)。U3D有个概念,那就是component(成分)--类似Maya的节点。包括脚本,所有元素属性都是游戏物体的component。添加、删除、停用、读取、写入component信息,就是脚本所要做的(尽管脚本也是个component)。
net语言的C#,在不同脚本之间调用变量和方法时,如果脚本位于同一路径下,那么只需要对非static(静态)成员进行new实例化即可。例如a.cs和b.cs,要调用脚本a中的一个非静态变量cc,需要在脚本b中写入:a
c=new a(),然后c.cc的格式完成调用。不过,作为一个component,要调用不同脚本之间的成员,U3D的规则是使用GetComponent函数来完成(其实也就相当于new的作用,只是U3D不支持这种脚本间调用的写法)。如:
someScript = GetComponent&ExampleScript&();
如果是在C#脚本中调用JavaScript脚本,则使用强制类型转换语法:
someScript = GetComponent(“ExampleScript”) as ExampleS
*&&这个特殊的符号表示使用的是C#中的泛型功能,用于避免强制类型的转换,减少装箱量(将值类型专为引用类型的操作)。
根据脚本使用的情况,可以有以下做法:
1.脚本位于同一个物体上。
可直接使用泛型或者类型转换语法调用。
如:someScript = GetComponent&ExampleScript&();
2.脚本位于不同物体上。
需要使用Find或相关的搜索函数,取得指定名称的物体信息后,再+”.GetComponent”函数。如:GameObject.Find("stone").GetComponent&ExampleScript&()。
3.脚本位于同一路径或者被调用脚本位于主脚本的路径及以下(脚本是否被物体使用都可)。
将被调用脚本中的成员(变量或方法)使用static标识,然后可以通过”脚本.成员”的格式直接调用。例如:
ScriptA.CS
public static mm();
ScriptB.CS
ScriptA.mm();
不过,static成员的调用虽然提高了效率,但因为它常驻内存,所以在会产生大量系统资源要求的情况下要慎用。
*static是C#定义变量或方法类型的关键字,使用static的变量或方法,不需要new实例化即可直接调用。
【脚本内容】
除了JavaScript函数,C#和BOO的脚本都需要预先载入类库。这里以C#为例:
using UnityE
using System.C
public class NewBehaviourScript : MonoBehaviour {
NewBehaviourScript是脚本的名称,它必须和脚本文件的外部名称一致(如果不同,脚本无法在物体上被执行)。所有游戏执行语句,都包含在这个继承自MonoBehaviour类的自创脚本中(大括号内)。
以下介绍一些常用的内置运行函数(定义函数时,JavaScript的关键字是function,C#是void,BOO是def。如:void Start()。
Awake:在游戏运行时调用,用于初始化。
Start : 只在游戏开始时执行一次,在Awake()函数后执行;
Update:在游戏每一帧都执行一次,在Start()函数后执行;
LateUpdate:同Update,只是它会在Update()函数执行后再执行;
FixedUpdate:当游戏中引入刚体系统,使用适配的方式同步物理时钟,可以让动力学更精确的计算;
OnGUI:绘制游戏界面的函数,因为每一帧执行多次,所以一些时间相关的函数要尽量避免直接在其内部使用。
OnMouseOver:鼠标停留在物体上时执行该函数的内容。
OnMouseEnter:鼠标进入物体范围时执行该函数的内容。和OnMouseOver不同,该函数只执行一次。
OnMouseExit:鼠标离开物体范围时执行该函数的内容。
OnMouseDown:鼠标按下时执行该函数的内容。
OnMouseUp:当鼠标释放时执行该函数的内容。
OnMouseDrag:按住鼠标拖动时执行该函数的内容。
OnMouse系列函数是针对指定物体的,如果要使用全局鼠标控制操作,则需要使用射线相关函数。还有很多特殊的游戏触发事件的函数,这里就不一一列出。
U3D内置的代码有个命名规则,开头第一个字母大写的词组都属于类或者函数,而开头小写的词组则是变量。新手经常会混淆它们之间的区别。简单说来,函数词组可以作为变量的类型,还可以直接执行功能,词组后必接成对小括号;变量是对应函数的分支,实现的是对一个具体属性的控制。例如:
Camera和camera。当场景中存在一个默认的主摄像机,脚本位于摄像机时,Camera.mainCamera.transform和camera.transform是等同的;假如脚本在其他物体上,Camera.mainCamera.transform仍旧直接获取了主摄像机,而camera.transform必须要使用Find函数先找到指定名称的摄像机:GameObject.Find("mainCamera").camera.transform。当然,这里是列出细节来比较,实际运用时,脚本位于特殊元素上我们可以不用声明这个元素的类别,如camera.transform可以简化到transform。
GameObject和gameObject。前者包含查找,破坏和产生游戏物体的函数,同时可以将一个变量定义为“游戏物体”类型;后者则包含丰富的游戏物体属性,例如名称,变形信息,动画,渲染等。
同上面列举的camera,对于直接作用于指定物体的脚本,gameObject也可以省略掉。不过,在开始学写代码时,书写完整的变量名能让我们更深刻的记忆每个属性和变量的关系。
通过以上对比后可以这么理解,函数通常是全局控制(包含脚本外的其他物体),而变量是需要指出具体的应用对象。
*如果书写代码时语句不在函数作用范围内,编译器将无法智能完成一些变量的全名显示。
更多函数的运用方法,用户可参考官方提供的帮助文档。
【简单例子】
在一个箱子上按下鼠标左键,箱子就开始旋转,同时灯光被点亮,屏幕出现“Test”的字样。
1.点击Hierarchy栏下的Create,创建一个Cube,Plane和Spotlight。
2.在Assets目录下,创建文件夹(右键,Create-&Folder),用于存放游戏的各种资源:模型,动画,材质,脚本,Prefab等。
3.双击进入myScript文件夹,创建一个C#脚本。
4.给脚本命名,然后再双击开启脚本编辑工具(如果脚本名称和内部的类名称不同,一定要更正)。
5.加入鼠标相关函数,这里我需要用到OnMouseOver,OnMouseExit,OnMouseDown。此类特殊函数不会有智能拼写出现。
6.语法方面就不傻瓜式的一步步进行了,实现的思路是:
当鼠标移动到物体上,物体的材质色彩变为黄色,同时将一个初始值为假的布尔变量1的值取真;当鼠标离开后,物体材质色彩还原,布尔变量1值为假;当按下鼠标左键,且布尔变量1的值为真,布尔变量2的值为真。
*OnMouse函数都是执行一次的函数,因此不能将和动画有关的控制函数放于其内执行,通常会使用布尔开关来控制Update函数中的动画函数。
7.接着在Update函数内实现:
当布尔变量2的值为真,物体旋转。
8.将写好的脚本拖拽到场景中的方块上(或者先选择方块,将脚本拖到方块的属性栏),调好摄像机位置,执行测试;
9.因为脚本只作用于其所依附的物体,要控制灯光,我们有两个选择:创建新的脚本,使用查找物体函数。很显然,我没必要为这么简单的功能加入一个新的脚本。因此我使用Find函数获取灯光的强度属性。
*脚本中遇到这样一串长长的语句时,通常会使用一个自定义变量来替代,而且很多时候还能降低计算量。例如:
float LightInt =GameObject.Find("Spotlight").light.intensity。如果在Start函数中初始化,Update中就不必每帧执行查找函数,降低游戏效率。不过这里作为一个测试,我也就很省事的忽略了。
10.GUI的使用。要在游戏视图显示各种UI信息,都需要使用U3D的UI组件或者GUI函数。为方便阅读,我将其他函数的内容收起,并使用GUI函数的Label创建简单的文字显示功能(有关GUI更多的详细信息,请参阅官方文档,我会在后面再做讨论)。
11.最终测试:
12.发布。执行File-&BuildSettings,开启发布界面。设置好要发布游戏的平台以及一些发布的信息,点击Build按钮即可发布一个完整的游戏客户端。U3D支持发布的平台与用户授权和操作系统有关,如IOS游戏需要MAC平台的U3D才能发布,Android需要在系统安装安卓SDK包,次世代主机平台则需要用户向官方购买额外解决方案。
*由于商业策略的分歧,U3D刚宣布了中止flash平台的后续开发,看来想玩U3D开发的网页游戏,还是需要先安装U3D官方的网页插件。
游戏制作并不简单,这里仅仅是一个初入门的小例子,主要是对脚本使用方式的练习。后面会逐步深入学习U3D丰富的函数功能。
基于U3D的VR开发教程:(1)基础环境配置
U3D开发学习之路--C#基础
u3D初级脚本总结
u3d shader入门写法
没有更多推荐了,}

我要回帖

更多关于 迷你世界的故事,方块复制体 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信