若x为若k是int型变量量,则执行x=7;x+=x-=x+x语句后的x值是多少

4221人阅读
Unity3D教学(102)
Unity技术文章(178)
Unity新闻(67)
这里介绍的是如何使用脚本最简单的模拟出跳跃的效果。
脚本源码如下:
var speed = 3.0; //This data type is a float.
var jumpSpeed = 50.0;
var grounded =
function Update ()&
& & & & var x : Vector3 = Input.GetAxis(&Horizontal&) * transform.right * Time.deltaTime *
& & & & var z : Vector3 = Input.GetAxis(&Vertical&) * transform.forward * Time.deltaTime *
& & & & //transform.Translate(Input.GetAxis(&Horizontal&), 0, Input.GetAxis(&Vertical&));
& & & & transform.Translate(x + z);
& & & & transform.rotation = Quaternion.LookRotation(Vector3.forward, Vector3.up);
& & & & if(Input.GetButtonDown(&Jump&))
& & & & & & & & Jump ();
function Jump ()
& & & & if(grounded == true)
& & & & & & & & rigidbody.AddForce(Vector3.up * jumpSpeed);
& & & & & & & & grounded =
function OnCollisionEnter(hit : Collision)
& & & & grounded =
& & & & Debug.Log(&I'm colliding with something!&);
其中,这行代码尤为重要:
transform.rotation = Quaternion.LookRotation(Vector3.forward, Vector3.up);
如果注释掉这行代码,物体在跳跃的时候会出现空中翻转的现象,添加后物体不会出现除了z轴之外的其他旋转。
一个完善的角色移动的脚本源码如下:
var speed : float = 6.0;
var jumpSpeed : float = 8.0;
var gravity : float = 20.0;
private var moveDirection : Vector3 = Vector3.
function Update()
var controller : CharacterController = GetComponent(CharacterController);
if(controller.isGrounded)
& & & & moveDirection = Vector3(Input.GetAxis(&Horizontal&), 0, Input.GetAxis(&Vertical&)); //Allows for player input
& & & & moveDirection = transform.TransformDirection(moveDirection); //How to move
& & & & moveDirection *= //How fast to move
& & & & if(Input.GetButton(&Jump&))
& & & & & & & & moveDirection.y = jumpS
//Apply gravity
moveDirection.y -= gravity * Time.deltaT
//Move the controller
controller.Move(moveDirection * Time.deltaTime);& & & &&
如果想添加动画的话,使用如下代码即可:
function Update()
& & & & if(Input.GetKey(&d&) || Input.GetKey(&right&))
& & & & & & & & animation.Play(&RunFwd&);
& & & & else if(Input.GetKey(&a&) || Input.GetKey(&left&))
& & & & & & & & animation.Play(&RunBkwd&);
& & & & else if(Input.GetKey(&w&) || Input.GetKey(&up&))
& & & & & & & & animation.Play(&StrafeL&);
& & & & else if(Input.GetKey(&s&) || Input.GetKey(&down&))
& & & & & & & & animation.Play(&StrafeR&);
& & & & else
& & & & & & & & animation.CrossFade(&Idle&);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:273864次
积分:5257
积分:5257
排名:第4295名
原创:259篇
转载:36篇
评论:52条
(49)(96)(55)(10)(23)(24)(16)(7)(11)(4)15751人阅读
Unity3D(10)
Unity中的JS,也称UnityScript,和基于浏览器的JS有比较大的区别,因为UnityScript是基于Mono的.net 的IL语言规范,CLR运行环境(Mono虚拟机)上设计的语言。
0.基本概念:
Unity3d中的脚本可以与游戏对象链接,变量数值的修改以及实时预览脚本修改后的游戏效果,节省了很多脚本调整和调试的时间,提高了开发效率。
简单的项目和Unity中的大量例子和脚本资源包都是用JS。商业项目基本都用C#,因为C#和C/C++交互方便,丰富的数据结构和面向对象的架构利于大型程序的编写,很多强大的第三方插件是用C#开发的,方便工作流程。
编译过程:
UnityScript运行环境使用Mono &的.NET Framework。实际上,UnityScript是用Boo实现的,Boo是运行在Mono虚拟机上的一种语言,并且编译成本机代码。JavasScript很多典型的运行环境如String和Math库由Mono提供。你也就知道了为什么UnityScript中方法名要大写了,因为要与Mono中相同。
Unity中的脚本和传统的解释型(JIT解释)语言不同,都是需要经过编译的,因此速度都一样快。
这三种语言的代码最后都会被编译执行,而且脚本可以互相访问。
库的调用:
Unity的脚本基于Mono的.net平台上运行,脚本都可以使用.net库,为xml,数据库,正则表达式提供了良好的解决方案。
Unity中js想调用mono的.net库,直接import即可。
import System.IO;
否则,你带指定完整的命名空间来调用函数,如System.IO.File.Open(),而不是File.Open()。
1.基本类型和语句:
1)数据类型:
数值类型:char,byte,short, ushort, int, uint, long, float, decimal.
布尔值:boolean
字符串:String,[index]符号
字符串[0]是字符串取下标为0的字符。
var s: String = &Whatever_it_may_be&;
s =s.Replace(&_&[0], & &[0]); // replace all the underscoreswith spaces
2)变量声明:
变量必须先声明[必须](编译缘故,且声明类型有利于减少太多常量,避免内存泄露发生),可以定义类型[可选]:
var playerName:S
函数的参数也要声明类型:
function Test( playerName:String, baseInfo:Object )
如果声明时候定义或赋值了类型,那么不能再改变类型,除非声明时候不定义类型。
var a= &test&;
a =5;// 报错
a =&test&;
a =5;//正确
变量前面可以加public,protected, private来修饰;不写默认是public的,public的变量可以在Inspector视图中查看和编辑。
内建自定义数组(快功能简单):
var values : int[] = {1,2,3};
转换到Array数组(需要对数组处理),var arr = new Array(values);
Array对象数组(慢动态增长排序合并功能):
var arr = new Array(); arr.Push(&good&);
转换到内建数组(需要比较高的性能时候),var bArray : int[] = arr.ToBuiltin(int);
4)链表和泛型:
UnityScript可以使用泛型,所以当用到动态大小的数组时,最好用List来替代Array。基本上就没有什么理由要用到Array了,List更快并且功能更多。如果你需要混合类型的数组,你可以用Object List。UnityScript中泛型的语法与C#中接近,除了要加一个额外的“.”符号在“&&”之前。如C#中的&varmyList = new List&int&();&在UnityScript中对应的写法为:&var
myList = new List.&int&();&。
5)运算符和表达式:
每行必须写分号; 比C多了for in 用于遍历对象元素,for(var i:int = 0; i & 10; i++)。
switch可以使用String变量。
声明规则:
function函数名(参数1:参数类型, 参数2:参数类型...):返回值类型
unityScript中的函数可以视为Function类型对象,可以像变量一样进行赋值比较等操作。
不能写匿名函数。
Math需要用Mathf。
3.类(DOM js中没有类):
在Unity里,一个js文件就是一个类,unity引擎会为js文件自动生成一个类。
对于UnityScript脚本,Unity编译该文件时会自动的为脚本添加一个与脚本文件名相同的类,并自动地继承于MonoBehaviour。但对于C#或Boo,则需要在脚本中显式的写出类名和继承关系。要创建不继承自MonoBehaviour的类,用C#语言,或者从外部添加js脚本资源(就可以自己直接new对象出来了)。
//SayHello.js
#pragma strict // 严格类型检测,尽早生成错误,禁用动态类型,强制用静态类型(强类型)
function sayHello()
等价于C#中:
#pragma strict
public class SayHello extends MonoBehaviour
& function sayHello()
但是,你可以在同一个文件中声明多个类,尤其是当你需要使用一些辅助工具类时非常有用,一般这种辅助类没有继承自MonoBehaviour。
class ButtonState {
& var currentState :
& var offset : Vector2;
如果你在一个文件中声明了MonoBehaviour的子类,但类名与文件名不匹配的话,即使是大小写不一致,你也会碰到麻烦。
一定要理解,当你在js文件中编写行为脚本是,你实际上在编写一个类:
a) 类及其对象:文件名就是类名,如果文件名是foo.js,你就可以在其他地方以var x = new foo()的格式进行调用;
b)类的方法和预定义方法:有一些特定的方法是实现系统预先定义的一些事件处理器,如Start、FixedUpdate等。任何事件中,声明的一个函数就是这个文件所代表的类的一个方法。
c) 类的属性:文件中在函数定义之外编写的代码都在该类的范围之内执行,声明的变量也是该类的成员变量。类中的静态函数、变量本质上是类的方法与属性。
/*whenyou drag the behavior onto a gameobject, these values will be visible andeditable
public name : S
/*otherscripts which have a reference to this object (e.g. if they're attached to thesame object) can see public functions
publicage :
/*privatemembers are NOT visible to other scripts, even if they have a reference to thisobject
private favoriteColor : C
/*youcan assign a value to bestFriend by dragging a gameObject with an attached copyof the foo behavior to this property. This will give you access to bestFriend'spublic methods and members
public bestFriend :
/*this function will be called every frame by Unity, so it's actually an eventhandler
function Update(){
&/*transform is a property inherited from thegameObject the behavior is attached to*/
function Bar(){
& // this is just a function, if you don't callit yourself, it will never do anything
Unity里需要extends关键字:
class MyHello extends Hello
DOM js中用prototype里的bind()方法。
Unityjs里面还提供了虚拟函数。
类的继承也是不同的。在JavaScript和C#中,方法是隐型并且不可重载,除非方法声明中添加虚拟关键字。不同的是C#只重载那些包含重载关键字override的方法。而JavaScript不需要关键词,只要重载类方法就可以覆盖,其它的都可继承得到。
var foo = &hello, world&;
function doEet () {
& // does nothing, intended to be overridden
将会生成:
import UnityE
classFoo extends MonoBehaviour {
& public var foo = &hello, world&;
& public function doEet () {
&&& // does nothing, intended to be overridden
子类写法:
//PrintingFoo.js
class PrintingFoo extends Foo {
&& function doEet() {
&&& print( foo );
创建虚函数:
&&&& virtual function DoSomething ()
&&&&&&&& Debug.Log(&from baseclass&);
//SubFoo.js
class SubFoo extends Foo
&&&& virtual function DoSomething()
&&&&&&&&& Debug.Log(&from subclass&);
//Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//printsfrom sub class
如果你要调用父类的方法,用关键字super。示例如下:
class SubFoo extends Foo
& virtual function DoSomething()
&&& super.DoSomething();// 不是虚函数,应该不需要super修饰就可以直接调用。
&&& Debug.Log(&from sub class&);
//Elsewhere
varfoo : Foo = new SubFoo();
foo.DoSomething();//prints&from base class& and &from sub class&
类间通信:Use-a方式(关联关系)比继承耦合度底得多,易于修改维护
/*Foo.js */
varbar : B
function Start(){
& bar = gameObject.GetComponent(Bar);
function doEet(){
& // do my own thing
& if( bar ){
&&& bar.doEet();
/*Bar.js */
& function doEet(){
&&& // do something special
Unity中不一定可以用new
创建对象(普通类可以,特殊类不行,各种脚本都一样)。特殊类:用编辑器工程视图右键或者组件Create js 或者C#的类都是继承自MonoBehaviour类,对这种类型的类不能new出来一个对象,原因是Unity会为这种类自动创建对象,并调用被重载的方法。&
使得用Unity非常有趣的一件事是,它的类采用了非常自由的mixin策略。通常你可以非常快速简单的查到你所需要的类。最通用的一个例子是Transform类,对于你正在处理的一个对象,所有被附加到该对象的相关联的类,都可以简单快速的获取它的属性和方法。
比如,典型的动作就是你会访问名叫&transform&的变量,它代表与该对象关联的Transform类的实例。如果你需要相关的位置坐标,就访问transform.position(一个 Vector3对象);如果你需要它的GameObject,就访问transform.gameObject;如果你需要它的渲染器,就访问transform.renderer。等等。一般如果你一个对象的主要属性,你就可以快速获取该对象所有其他的属性。
6.js和C#单向通信,不能双向通信,因为编译问题
js访问C#脚本组件:
//createa variable to access the C# script
private var csScript : CSharp1;
function Awake()
&&& //Get the CSharp Script
&&& csScript =this.GetComponent(&CSharp1&);//Don't forget to place the 'CSharp1'file inside the 'Standard Assets' folder
//rendertext and other GUI elements to the screen
function OnGUI()
&&& //render the CSharp1 'message' variable
&&& GUI.Label(new Rect(10,30,500,20),csScript.message);
C#访问js脚本组件:
using UnityE
using System.C
public class CSharp2 : MonoBehaviour
&&& //create a variable to access the JavaScriptscript
&&& private JS1 jsS
&&& void Awake()
&&&&&&& //Get the JavaScript component
&&&&&&& jsScript = this.GetComponent&JS1&();//Don'tforget to place the 'JS1' file inside the 'Standard Assets' folder
&&& //render text and other GUI elements to thescreen
&&& void OnGUI()
&&&&&&& //render the JS1 'message' variable
&&&&&&& GUI.Label(newRect(10,10,300,20),jsScript.message);
7.使用第三方库:
第三方.NET库如XML-RPC可以以新建资源Asset的方式引入。
可以用print函数,Log()函数或者Debug.Log(),想设置断点,用Debug.Break()函数。
print() 函数将会生成消息,并输出到状态栏及控制台中,但仅限MonoBehavioour类范围内。
更好的办法是使用Debug.Log(&insert messagehere&);,该方法到处都可使用。还可用Debug.LogWarning 和 Debug.LogError生成警告和错误消息。
Debug.Break(); 可以将游戏暂停在一个精确的点。当一种特定的情条件发生时,如果你想检查对象的状态的时候,这个特性非常有用。
开发环境运行项目时,编辑界面也是完全实时更新的,你可以查看对象实例的内部状态。
参考整理自:
/x3d/p/3838619.html
更多的细节:阅读和编写大量unityScript代码。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:409305次
积分:6508
积分:6508
排名:第3017名
原创:265篇
转载:58篇
译文:10篇
评论:39条
(6)(2)(5)(4)(7)(14)(14)(6)(27)(1)(8)(2)(18)(32)(15)(12)(6)(21)(26)(40)(1)(4)(9)(22)(3)(4)(1)(1)(1)(1)(2)(1)(18)(1)【JS脚本问题】transform 与 Transform 的区别?_unity3d吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:66,677贴子:
【JS脚本问题】transform 与 Transform 的区别?收藏
最近在研究 BootCamp 里士兵的摄像机视角。在“SoldierCamera”脚本里看到了两个变量:变量定义部分:public var target : Tprivate var camTransform : T变量赋值部分:camTransform =target.position = cP
//var cPos : Vector3;而这里,附着对象是一个摄像机,那么,在外部已直接将target将这个摄像机赋值上了。那么这两个赋值语句到底是哪一个影响了摄像机的位置?翻了半天手册也没看出个所以然...下面放出程序代码,求指教~
SoldierCamera.js大小:7.62KB下载:9次转存:1次
全自动凉皮机 真神
Transform是类型 transform是属性~ transform属性的类型也就是Transform~。。。这个如果不清楚的话。。慢慢学着学着就明白啦~~。。
我估计都会改变,最简单就是在Update()里一个写向前移动,一个写向后移动,每帧距离一样,如果不动说明都影响
大写的Transform只是个类型,你申明了这样一个变量后是要赋值的,附加的值为Transform所对应的小写transform属性
脚本代码段中出现过这样的几个代码,我把我的理解写成了注释:camTransform.position = cPos + (camDir * targetDistance);//确定摄像机的位置camTransform.LookAt(lookPoint); //使摄像机只想LookPoint点target.position = cP //确定摄像机的位置target.rotation = Quaternion.Euler(y, x, 0);//确定摄像机的角度如果说,camTransform与target都能改变摄像机位置的话,那么这四句代码的操作不会互相影响吗?
一般来说,transform是指附着脚本的物体的Transform,而Transform则是一种变量的类型
target应该是给他你要操作的角色吧,否则略奇葩啊
额。。我发现问题所在了,target对象应该是附着在人物身上的一个空游戏对象,我把名字搞混了。。。这样之前的问题就都说得通了,粗心惹的祸啊。。。但是我还有一个问题就是关于游戏属性的改变,在这段代码中有语句:camTransform = transform,而之后改变camTransform就能直接改变摄像机的属性值。这是不是意味着在JS代码中,任何变量的相互赋值后,改变其中一个边量,另一个变量也会跟着改变?
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或43890人阅读
Unity(33)
转自:.cn/s/blog_7c336a8301013son.html
我一直向所有想做游戏的朋友推荐Unity3D,为什么呢?首先是因为专业,Unity3D非常强大,用它创建一个类似MiniGore这样的3D平面射击游戏简直轻而易举,而就连使命召唤这样的大型3d游戏,如果素材得当也不在话下。二是因为易用,他的操作非常容易,而使用的脚本语言又是JavaScript或者C#,不仅非常简单,也让各个种类的程序员都非常容易上手。再次,就是因为免费,如果你不使用Pro或者Mobile的内容的话,Unity3d就是完全免费的。还有就是对3D模型的兼容性,几乎任何3d模型都可以导入到unity中,可以说是一个很方便的特性。
今天,我就来讲讲Unity3D的基础操作,这可以说是一个新手必读吧,读完之后,你一定会惊叹,原来做一个游戏这么简单。
第一节 加入重力
我们先打开Unity3d,新建一个场景(Scene),新建的时候应该会有对话框要求你加入哪些Asset Package,记得选择Physics Material,因为后面我们一定要用的哦亲。
如果创建的时候没加,你可以再后来的Asset菜单里加:
之后,我们建立一个Cude,调整一下x和z的大小,我这里调成了25,让它变成一个地板,你也可以放一个texture上去,看起来更加真实,我这里从简,再创建一个sphere,在component中选择Physics中的RigidBody,前提是选中你的sphere物体,之后会看到这个Sphere的inpector中加入一个component叫做RigidBody,调整好Camera运行一下,你就会发现Sphere受到重力的影响自动掉落到地板上。
之后,通过我们之前引入的Physics Materials资源包,你还可以选择这个物体的物理性质,我这里选择Bouncy(跳跳),落下之后,这个物体就会蹦来蹦去的,呵呵
第二节 检测碰撞
下面我们通过简单的JavaScript语句来检测碰撞,这在制作游戏中是很有用的,比如说检测到子弹和敌人的碰撞之后,可以使用我们后来要讲到destory命令消灭敌人。
这次我们新建一个Terrain项目,在用Grass贴图来覆盖住它,如果你找不到贴图的话,记得在Asset菜单里找找,看看哪些资源你还没有引入进去。
然后再加入一个Cube项目,我这里叫做PlayerCube,为他加上重力,之后选择bouncy性质,然后我们再新建一个Cude,调整y和z的值让他变成一堵墙,放置好,命名为Wall,别忘了给Terrain改名为Terrain,
之后我们在Asset菜单中建立一个JavaScript项目,改名为CollisionDetect,双击打开,如果你使用的是Unity 3.5的话,就会打开MonoDev,这是一个新工具还是很好用的,在其中新建一个函数,别管Start和Update函数,我们待会会讲。
加入以下代码:
function OnCollisionEnter(theCollision : Collision){
if(theCollision.gameObject.name==&Terrain&){
Debug.Log(&Hit terrain&);
}else if(theCollision.gameObject.name==&Wall&){
Debug.Log(&Hit the wall&);
如果看不懂这些代码的话,也没关系,JavaScript是最好学的编程语言,Google一下吧,保存这个JS文件,然后拖到我们的PlayerCube上。
这时候我们运行,就会看到PlayerCube到处蹦,碰到Terrain的时候,控制台就会显示Hit Terrain,碰到wall的时候就会显示Hit the wall。
第三节&&检测用户输入
下面我们来讲一下如何检测用户的键盘和鼠标的操作。
就用我们上次的那个场景,这次我们给PlayerCube加上我们可以控制的动作。就是通过“wasd”或者上下左右键来控制移动。
请注意,如果要使用这里使用的方法来控制移动,那么所控制的物体不能够是一个物理世界的物体,也就是说你要把RigidBody这个component删掉,如果你想要在物理世界里移动物体的话,你就需要我们在下面会讲到的力(force)。
首先我们新建一个JavaScript文件,这里命名为InputDetect吧,输入下面的代码:
#pragma strict
var Player : GameO
function Start () {
function Update () {
Player = GameObject.Find(&PlayerCube&);
if(Input.GetKey(KeyCode.W)){
Debug.Log(&Hit w&);
Player.transform.Translate(Vector3.forward * 2);
}else if(Input.GetKey(KeyCode.S)){
Debug.Log(&Hit s&);
Player.transform.Translate(Vector3.back * 2);
}else if(Input.GetKey(KeyCode.A)){
Debug.Log(&Hit a&);
Player.transform.Translate(Vector3.left * 2);
}else if(Input.GetKey(KeyCode.D)){
Debug.Log(&Hit d&);
Player.transform.Translate(Vector3.right * 2);
这时,我们运行这个游戏,就可以通过“WASD”来控制PlayerCube的移动了。
第四节 使用Prefab复制和控制物体
我们可以直接把Prefab看做是个妈,她能生好多小孩,如果妈妈的DNA变了,小孩的跟着变,就是说你可以用Prefab创建物体,然后通过这个Prefab修改所有这类物体的性质,这对于批量生成的敌人或者NPC来说很有用。
首先,先创建一个Prefab,我这里命名为“Mother”,之后新建一个Sphere物体,当然你也可以建一些其他的物体,之后给这个Sphere加上你想要的性质,我加入了RigidBody和Bouncy,之后将Sphere拖到Mother上,你会发现mother变蓝了,之后你就可以随意拖一些mother物体到屏幕上去,你会发现所有的Prefab创建出的物体在清单上都是蓝色的,说明他们都有共同的性质。
当然,作用于一个Prefab上的脚本也会作用到它的子物体上去。
第五节 使用Destroy命令消灭物体
我们游戏中怎么能够没有敌人呢?有敌人就得能够消灭他们,这时候,我们就会使用Destroy命令了。
在这里,我们使用上次Mother生出来的小球球作为敌银,一旦我们的PlayerCube碰撞到了小球的话,就是用Destroy让小球消失。
新建一个JavaScript脚本,输入以下代码:
#pragma strict
var mother : GameO
function Start () {
function Update () {
function OnCollisionEnter(theCollision : Collision){
mother = GameObject.Find(&Mother&);
if(theCollision.gameObject.name==&Mother&){
Debug.Log(&Hit mother&);
Destroy(mother);
这段代码很好懂吧,就是检验碰撞,然后销毁碰撞到的Mother物体,别忘了把Destroy的JavaScript文件拖到PlayerCube上去。运行一下,就可以看到碰撞到的物体都被消灭了。
第六节 使用Instantiate命令创造物体
我们直接在界面创造的物体都只是会在界面被初始化的时候加载,那么,如果为了节约内存或者其他什么事情,我想要在游戏过程中添加物体,那该怎么办呢?你猜对了,就是用instantiate命令。
这个命令就是英文实例化的意思,下面我们给碰撞之后消失的mother物体继续初始化一些,也就是说消灭了一些,又来了一大波···
为什么非要用mother呢?因为只有拥有Prefab的物体才能够使用这个命令哦亲。
function Update () {
var instance : GameObject = Instantiate (PreFab,transform.position,transform.rotation);
注意:这样的话,每次刷新一帧都会出现一个新的mother物体,你的内存也许会受不了哦,更合理的方法是按下空格键,然后出现一个新的物体,你可以自己做吗?试试看
你可能已经注意到了,每一个初始化的脚本都会默认有两个函数,就是:
Update()函数 —— 每刷新一帧都会检查并执行
Start()函数 —— 只在场景初始化的时候执行
第七节 使用Timer计时器
这次,我们要让一个计时器倒数,倒数到0的时候创建一个mother物体,来看Javascript代码吧:
#pragma strict
var myTimer : float = 5.0;
function Start () {
function Update () {
if (myTimer &= 0){
myTimer -= Time.deltaT
guiText.text=(&&+myTimer);
if (myTimer &= 0){
guiText.text = (&Done&);
把这个脚本拖到GUItext控件上,你会发现我们所期待的效果。
第八节 让物体动起来
其实让物体行动的技巧,我们已经会了,不是吗?
如果你觉得不是的话,没有认真的看上面的文章哦,我就再给你讲一次吧。
请特别注意,这种方法不适合物理世界的物体,如果向移动物理世界的物体,请看下一节:
创建一个Cylinder物体,之后将下面的脚本附着在上面。
#pragma strict
var myObject : GameO
function Start () {
function Update () {
myObject.gameObject.Find(&Cylinder&);
myObject.transform.Translate(Vector3(0,0,1));
第九节 使用物理世界的力
这里是我们讲移动物体的重点,因为大部分的物体移动都是在物理世界完成的,而如果想要在物理世界移动东西,除了position和rotation的移动之外,就是使用“力”了,在高中学过经典物理学的人都知道,要使物体用移动,木有力是不行的,那么我们就开始吧,再新建一个什么物体,我新建了一个Capsule。
之后,我会在这个物体的上方加一个力,让它用力的向下飞,触碰到地之后,通过bouncy这个性质再弹回来。新建一个JavaScript文件,就叫做Force吧,加入如下代码:
#pragma strict
var Power : float = 500.0;
function Start () {
rigidbody.AddForce(Vector3(0,Power,0));
function Update () {
运行之后,会发现capsule其实是个很有幽默感的物体。
第十节 使用贴图和材质
贴图和材质能够使你的虚拟3D世界看起来更加真实,不幸的是,需要大量在PS和AI中的设计工作,最近我一想到要打开PS就有点烦···呜呜。
闲话少说,我已经做好了一个贴图,怎么使用在材质上呢?之后我们怎么才能通过材质使用到其他物体之上呢?
就像你看到的一样,我是直接拖进去的···
之后我们从新建菜单中选择Material这一项,之后选中material,将贴图拖进material的贴图选框里,之后,就可以拖动这个Material赋给任何物体了。
第十一节 使用声效和音乐
音效和音乐对于一个游戏来说是非常重要的,一个寂静无声的世界是无聊的,而且不真实,什么?你说声效和音乐是一个东西?那你就错了,声效是,比如说发射子弹的声音,什么东西爆炸的声音等等,而音乐则是背景音乐什么的,不一样的亲。
对于音乐来说,往往使用立体声音乐,而对于生效来说,我们随便使用一个简单的音乐文件就可以了。
想要在Unity3D中播放音乐,你需要两样东西,一个是监听器,一个是音乐源,监听器是Camera的一个组件,所以你不用担心,你唯一需要增加的就是音乐源。
直接将项目中的音乐拖放到Audio Source项就可以播放,但是如果我们想要在某个特定的点上 播放音乐该怎么办呢?答案就是,写一个脚本,新建一个脚本,输入如下代码:
#pragma strict
var myClip : AudioC
function Start () {
AudioSource.PlayClipAtPoint(myClip,transform.position);
function Update () {
之后将这个脚本拖放到我们的物体上,最后,将音频文件拖放到AudioSource选项框中。
第十二节 使用关节
关节在3D游戏之中的应用非常广,主要在于物理世界的重力影响,下面我们就通过关节来制作一个钟摆。
这次我们新建一个场景,松了一口气?刚才的场景是不是太乱了?你做的时候可以整理一下嘛,呵呵
新建一个cube作为地面,之后一个cube放在上空作为摆垂,之后用几个capsule分别用component中的fixed joint连接起来,之后最上面的那个capsule与世界相连,使用Hinge Joint,这样的话,他会默认与世界相连,不用担心,看图
第十三节 使用Axes
在Edit – Project Setting – input 中可以查看各种形式的input,这些input方法在unity中被叫做Axes。
我们创建一个JavaScript,叫做GetAxes,输入以下内容:
#pragma strict
function Start () {
function Update () {
var Honriz : float = Input.GetAxis(&Honrizontal&);
Debug.Log(Honriz);
在拖放脚本之后,运行这个场景,看看控制台输出了什么,你就明白了。
第十四节 使用触发器
触发器一般用于检测一个物体是否处于一个空间内,他是怎么做到的呢?
首先,他创造一个大的物体,之后将他的randerer属性去掉,他就隐形了,这样,我们再把他的isCollide属性去掉,他就不会发生碰撞了,之后,我们只需要用脚本检测物体是否与这个物体碰撞就可以了。
我们新建一个场景,做一个地板,再做一个底座,叠加起来,再在他们的上空做一个方块,设置rigidbody属性,将底座设置成为我们刚才说的那种隐形的状态,之后新建一个JavaScript脚本,输入代码
#pragma strict
function Start () {
function Update () {
function OnTriggerEnter (myTrigger : Collider) {
if(myTrigger.gameObject.name == &box&){
Debug.Log(&Hit&);
按下运行,会发现可以检测出Hit。
第十五节 使用GUI
其实我们已经学过了如何使用GUI text,不信,我们就用屏幕上的字代替我们在上面的程序中的Debug.Log现实的内容。
你自己能做吗?
试试看吧,一个下午写了这么多,有点累。
一定要在Unity中加入一个GUI Text,运行一下,就会发现屏幕上的GUI Text会随着你设定的的内容而变化了。
之后看些什么?
本教程的所有代码在Unity3D 3.5 F5 + Mac OS X Lion上测试可用。
欢迎关注我的围脖: @Oratis
在知乎和豆瓣上,我的名字也是Oratis
我会把之后发表的教程分享到这些社交网络中。
如果你有任何问题,欢迎在底下留言,也欢迎写信给我,我的邮箱地址是:&
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1275779次
积分:13292
积分:13292
排名:第774名
原创:44篇
转载:553篇
评论:195条
本博收藏大部分文章为转载,并在文章开头给出了原创作者及原文出处,如有再转,敬请保留相关信息,这是大家对原创作者劳动成果的自觉尊重!!
早期遗留的部分文章未能及时给出相关原创信息,在此谨致歉意,后续会尽全力予以纠正。如为您带来不便,请于本博下留言,谢谢配合。
(1)(7)(2)(18)(17)(17)(5)(3)(8)(11)(8)(6)(11)(3)(1)(13)(16)(10)(8)(15)(12)(4)(8)(3)(5)(1)(1)(1)(4)(2)(1)(4)(5)(3)(9)(18)(5)(1)(2)(2)(9)(3)(4)(1)(4)(3)(2)(1)(2)(1)(1)(6)(14)(1)(22)(4)(1)(13)(7)(9)(7)(4)(26)(10)(22)(9)(15)(12)(11)(1)(4)(3)(4)(1)(10)(7)(3)(12)(17)(1)(9)(17)(18)

我要回帖

更多关于 int型变量 的文章

 

随机推荐