2013-05-02 14:59:21 iteye_20251 阅读数 108

Unity3D中可以安装任意角度旋转游戏对象;如果要使用脚本实现游戏对象模型的旋转,则代码如下:

function Update(){

//旋转游戏对象模型

transform.Rotate(Vector3.up * Time.deltaTime);

}

 

 

注意:

1.transform.Rotate()方法用于绕自身旋转模型,其参数分别是旋转的角度与方向,Vector3.up表示模型自身旋转的方向为y轴,Vector3.fwd表示模型吱声旋转的方向为z轴,Time.deltaTime表示上一帧所持续的时间,它们的乘积表示模型一帧内旋转的角度。

 

视图如下:

 

接下来将脚本绑定到立方体中。因为系统每帧都会调用Update()方法,所以运行游戏后,立方体将缓慢地绕着y轴自身旋转。

<!--EndFragment--><!--EndFragment-->

2012-09-15 14:40:07 htttw 阅读数 37014

Unity3d与iOS的交互(1)



今天我们介绍Unity3d与iOS交互第一部分:iOS传消息到Unity3d中。下面我们开始吧:



1.

首先用Unity3d创建一个Plain,并调整好摄像机的角度以及光源的位置,如下所示:





2.

然后我们创建一个Cube,我们会在iOS中用Objective-C代码来控制它旋转:






3.

然后我们创建一个Rotate.js的脚本并把它关联到Cube上:

var vrotate : Vector3;  
  
//Rotate Left
function RotateLeft()  
{
	print("Rotate Left");
	transform.Rotate(Vector3.up * Time.deltaTime * 100, Space.World);
}  
  
//Rotate Right
function RotateRight()  
{
	print("Rotate Right");
	transform.Rotate(Vector3.down * Time.deltaTime * 100, Space.World);    
}  
  
//Rotate Up
function RotateUp()
{
	print("Rotate Up");
	transform.Rotate(Vector3.right * Time.deltaTime * 100, Space.World);    
}  
  
//Rotate Down
function RotateDown()
{
	print("Rotate Down");
	transform.Rotate(Vector3.left * Time.deltaTime * 100, Space.World);    
}

上面的四个函数分别朝不同角度选择Cube。我们会在iOS程序中调用这几个Unity3d中的函数。




4.

然后在Unity3d中Build为XCode项目,打开该项目。首先创建一个基于NSObject的类,名为MyViewInit,我们会将我们自己的界面初始化代码都放在其中。修改MyViewInit.h如下:

//
//  MyViewInit.h
//  Unity-iPhone
//
//  Created by tao hu on 9/15/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface MyViewInit : NSObject


+(void)CreateButton:title rect:(CGRect)rect action:(SEL)action controller:(UIViewController *)controller;
+(void)CreateTitle:(UIViewController *)controller;
+(void)LeftButtonPressed;
+(void)RightButtonPressed;  
+(void)UpButtonPressed;
+(void)DownButtonPressed;
+(void)Init:(UIViewController *)controller;


@end

其中的方法都是类方法。在Init函数中我们完成了所有我们自定义界面的绘制(添加了四个UIButton和一个UILabel)。




5.

修改MyViewInit.m如下:

//
//  MyViewInit.m
//  Unity-iPhone
//
//  Created by tao hu on 9/15/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "MyViewInit.h"

@interface MyViewInit ()

@end

@implementation MyViewInit


//创建按钮
+(void)CreateButton:title rect:(CGRect)rect action:(SEL)action controller:(UIViewController *)controller
{
    UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];

    //设置按钮范围    
    btn.frame = rect;

    //设置按钮显示内容    
    [btn setTitle:title forState:UIControlStateNormal];

    //设置按钮改变后绑定的响应方法    
    [btn addTarget:self action:action forControlEvents:UIControlEventTouchUpInside];    
    
    //加入View中
    [controller.view addSubview:btn];
}


//创建标签
+(void)CreateTitle:(UIViewController *)controller
{
    //创建label视图    
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];
    //设置显示内容    
    label.text = @"旋转控制";    
    //设置背景颜色    
    label.backgroundColor = [UIColor blueColor];    
    //设置文字颜色    
    label.textColor = [UIColor whiteColor];    
    //设置显示位置居中    
    label.textAlignment = UITextAlignmentCenter;    
    //设置字体大小    
    label.font = [UIFont fontWithName:[[UIFont familyNames] objectAtIndex:10] size:20]; 
    
    [controller.view addSubview:label];
}


//向左按钮  
+(void)LeftButtonPressed
{  
    UnitySendMessage("Cube", "MoveLeft","");  
}  

//向右按钮  
+(void)RightButtonPressed
{  
    UnitySendMessage("Cube", "MoveRight","");  
}  
//向上按钮  
+(void)UpButtonPressed
{  
    UnitySendMessage("Cube", "MoveUp","");  
}  

//向下按钮  
+(void)DownButtonPressed
{  
    UnitySendMessage("Cube", "MoveDown","");  
}  


+(void)Init:(UIViewController *)controller
{
    [self CreateTitle:controller];
    
    [self CreateButton:@"左旋转" rect:CGRectMake(0,  50, 100, 40) action:@selector(LeftButtonPressed) controller:controller];
    [self CreateButton:@"右旋转" rect:CGRectMake(0, 100, 100, 40) action:@selector(RightButtonPressed) controller:controller];
    [self CreateButton:@"上旋转" rect:CGRectMake(0, 150, 100, 40) action:@selector(UpButtonPressed) controller:controller];
    [self CreateButton:@"下旋转" rect:CGRectMake(0, 200, 100, 40) action:@selector(DownButtonPressed) controller:controller];
}



@end


其中:

UnitySendMessage函数有三个参数:

第一个是Scene中的模型的名称,第二个是已经绑定在模型上的某个函数,第三个是char *类型的参数,用来将参数传递给这个函数。


我们可以用这个方法调用Unity3d中的任意一个模型上的任意一个函数。




6.

最后我们要做的是在程序启动时调用上面的Init函数。找到AppController.mm文件:

int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight,  int* openglesVersion)

函数在Unity3d程序启动时会被调用,其中的EAGLView 就是Unity3d的背景的那个View。我们在这个函数中调用我们的Init函数。修改OpenEAGL_UnityCallback如下:

int OpenEAGL_UnityCallback(UIWindow** window, int* screenWidth, int* screenHeight,  int* openglesVersion)
{
	CGRect rect = [[UIScreen mainScreen] bounds];

	// Create a full-screen window
	_window = [[UIWindow alloc] initWithFrame:rect];
    
    
	EAGLView* view = [[EAGLView alloc] initWithFrame:rect];
	UnityViewController *controller = [[UnityViewController alloc] init];
    
    
	sGLViewController = controller;

#if defined(__IPHONE_3_0)
	if( _ios30orNewer )
		controller.wantsFullScreenLayout = TRUE;
#endif

	controller.view = view;
	[_window addSubview:view];
    
    
	[MyViewInit init:controller];


	if( !UnityUseOSAutorotation() )
	{
		_autorotEnableHandling = true;
		[[NSNotificationCenter defaultCenter] postNotificationName: UIDeviceOrientationDidChangeNotification object: [UIDevice currentDevice]];
	}

......


其实我们只加入了一句话:

[MyViewInit init:controller];


并在该文件首部加入:

#import "MyViewInit.h"




7.

好了,终于要在真机上运行了:

初始界面:





点击下旋转按钮:




旋转Cube:




我们发现在XCode的Console窗口中输出了Unity3d中的pirnt语句。因此,Unity3d中的print函数在真机上运行时是输出到XCode的Console中。





最后代码太大了,无法上传,有需要的可以和我联系或在下面留言。





本文参考了雨松MOMO的文章,在此表示感谢:

http://blog.csdn.net/xys289187120/article/details/6926746







完成!

2013-07-12 10:45:53 qqMCY 阅读数 1354


target对象为摄像机旋转的参照物,本例中他指向的对象是桥的模型。

LateUpdate()方法用于监听鼠标在屏幕中的坐标,计算出摄像机的位置与旋转的角度,继而实现通过移动鼠标移动摄像机的角度来观察模型。


public class Script_07_11 : MonoBehaviour 
{

	
	//摄像机参照的模型
	public Transform target;
	
	//摄像机距离默认的距离
	public float distance = 20.0f;
	
	//鼠标X轴、Y轴移动的角度
	float x;
	float y;
	
	//限制旋转角度的最小值与最大值
	float yMinLimit = -20.0f;
	float yMaxLimit = 80.0f;
	
	//X、Y轴移动速度
	float xSpeed = 250.0f;
	float ySpeed = 120.0f;
	
	void Start () 
	{
		//初始化X、Y轴角度等于参照模型的角度
		Vector2 angles = transform.eulerAngles;
    	x = angles.y;
    	y = angles.x;

   		if (rigidbody)
			rigidbody.freezeRotation = true;
	}
	
	
	void LateUpdate () 
	{
       if (target) 
       {	
       		//根据鼠标移动修改相机的角度
    	    x += Input.GetAxis("Mouse X") * xSpeed * 0.02f;
       		y -= Input.GetAxis("Mouse Y") * ySpeed * 0.02f;
 			y = ClampAngle(y, yMinLimit, yMaxLimit);
        	Quaternion rotation = Quaternion.Euler(y, x, 0);
        	Vector3 position = rotation * new Vector3(0.0f, 0.0f, -distance)+ target.position;
        	//设置模型的位置与旋转
       		transform.rotation = rotation;
        	transform.position = position;
    	}
	}
	
	float ClampAngle (float angle , float min , float max)
	{
		if (angle < -360)
			angle += 360;
		if (angle > 360)
			angle -= 360;
		return Mathf.Clamp (angle, min, max);
	}
}


2012-09-07 10:39:40 netliving 阅读数 156
今天开发了一个简单的房屋模型,在blender中采用了拉伸工具,做成了一个整体工具,然后导入到unity3d中,结果发现有些面不存在,非常难看。
经过google查询以后,找到了一个帖子问是不是bug,结果查找到了方案。

原来由于制作过程中“法线”比较混乱,造成一些面看不到(面是存在的,在unity3d中通过调整角度,是可以看到面的),所以需要重新调整法线,就可以了。
选中所有的点,然后选择Mesh/Normals/Recaludate Outside,然后重新导出,之后法线在unity3d中显示所有的面了。
2013-11-20 20:12:45 huangfe1 阅读数 837



那抱歉,上次那个Unity+kinect还没有更新,最近在深一步研究,不久将更新(绝对不负众望)!现在进入正题,十分钟带你打造unity3D第一人称射击游戏!

看完本篇博客,你将学会第一人称控制,粒子的添加,碰撞的检测,鼠标的监听,画2d图像,预制物体克隆,添加力,添加声音等等!(本篇博客假设你已经对unity稍微有点了解)

一,打开unity,创建一个场景,添加一个plane,(gameobject->createother->plane)。

二,添加虚拟第一人称任务(现在没搞模型,模型后面可以自己添加);Assert->importpackages->Charactercontroll,之后你将Project面板里面看到这个资源包,打开里面的charactercontroll文件,将里面的first Person controll拖动到合适的位置。

三,然后我们将添加一个虚拟的枪口,作为子弹的发生点!这个你可以创建一个椭圆,放在摄像机的最中间


 然后要将椭圆设置为摄像机的子物体,这样他将随着摄像机运动(不能设置为任务模型的子物体,因为任务模型的不能上下移动,也就不是这样后不能上下射击)。也就是在hierahcry面板中点击你创建椭圆,拖到摄像机上,这样他就成了摄像机的子物体。可以点击运行测试下,你会发现这东西只是虚拟枪口,所以我们设置它看不见,点击椭圆,在修改面板上,有个MeshRender,你单击下,椭圆就看不见了,但是它存在,然后再点击CapsuleColisder,取消他的碰撞(以免影响子弹的射击);
三,子弹的射击

我们首先创建一个圆,(用这个圆来模拟子弹,如果你自己有子弹模型,就用子弹模型),然后在project中创建一个prefab,用于之后的克隆子弹,现在我们来子弹一点火焰效果,Assert->importpackage->particles导入粒子,点击里面的fire,将里面的Flame拖到游戏中,位置和你创建的球(子弹)一样,然后将你设置的,然后同样的方法,将火焰设置为,子弹的子物体,这样,火焰将和子弹一起运动,自己在属性面板里 修改火焰的大小,然后将子弹拖到你创建的prefab中,修改prefab的名字为balls!添加一个刚体属性,Rigidbody(Addcomment->ragidbody)然后删除游戏中的子弹(嗯,删除)!现在子弹的预制物体已经创建好了,现在我们来射击!

四 ,点击鼠标,发生子弹

现在 就是敲代码码的时候了

var aim:Transform;
//克隆子弹
private var ball:Transform;
//绘制准星的材质
var material:Material;
function Start () {

}

function Update () {
//将鼠标的图标隐藏
Screen.showCursor=false;
//var zj=Vector3(Screen.width/2,Screen.height/2,0);
//var ray:Ray=Camera.main.ScreenPointToRay(Input.mousePosition);
//定义一个方向,为发射点y轴方向
var dir=aim.transform.TransformDirection(Vector3.up);
//var dir=ray.direction;
//按下鼠标左键
if(Input.GetMouseButtonDown(0)){
//实列化一个球,发射点的位置,
ball=Instantiate(balls,aim.position,Quaternion.identity);
//在某一个方向加一个力
ball.rigidbody.AddForce(dir.normalized*1000);
print("----------->>>");
//三秒后删除小球
Destroy(ball.gameObject,3);
}
}

 这里用到了,Screen.showCursor=false;将鼠标隐藏,要将他放在updatae中,放在start中不行var dir=aim.transform.TransformDirection(Vector3.up);这是定义一个方向,子弹将以这个方向射击

其他的没什么解释的了,注释很详细了,方法里面传入的参数,查一下API文档就行

五 ,现在们开始绘制准星

 

//绘制准星的材质

var material:Material;

先定义 一个材质,用来绘制图像

 

//绘制准星
function OnPostRender(){
DrawRecent(Screen.width/2,Screen.height/2,10,10);
}
//绘制四边形的方法
function DrawRecent(x:float,y:float,width:float,height:float){
//材质通道设置为默认的0
 material.SetPass(0);
 //绘制2D图形
  GL.LoadOrtho();
 //绘制长方体
 GL.Begin(GL.QUADS);
 //传入四个点的相对屏幕的坐标,先后分别是左上角,左下角,右下角,右上角
  GL.Vertex(new Vector3(x/Screen.width,y/Screen.height,0));
  GL.Vertex(new Vector3(x/Screen.width,(y+height)/Screen.height,0));
  GL.Vertex(new Vector3((x+width)/Screen.width,(y+height)/Screen.height,0));
  GL.Vertex(new Vector3((x+width)/Screen.width,y/Screen.height,0));
  //结束绘画
  GL.End();
}

 这个没什么好解释的,注释有,按照各个规则就是

 

然后就是,如果你射击到了敌人,敌人就着火

四,射击敌人

首先我们,创建几个cube,这个用来模拟敌人,如果你有好的模型,就用模型。给cube创建ridibody

然后给它一个标签,在属性面板上面有个Tag,点击,选择player,给个player标签,你也可以点击addTag自己添加一个Tag,现在我们创建一个prefab预制火火焰,创建一个空物体,将先前导入的fires拖到空物体中

将空物体放入prefab中,改名为fires

现在 我们添加碰撞事件

新建一个脚本,

 

#pragma strict
//预制火焰
var fires:Transform;
//克隆火焰
private var fire:Transform;
function Start () {

}

function Update () {

}//碰撞监听
function OnCollisionEnter(other:Collision){
//如果碰到的事cube(先前我们将cube的tag设置成了player)
if(other.transform.tag=="Player"){
//克隆一个火焰
fire=Instantiate(fires,other.transform.position,Quaternion.identity);
//设置火焰的父对象为箱子,这样火焰将和物体一起运动,
fire.transform.parent=other.transform;}
}

 五,你想加入声音嘛?如果你想,接着看两种方式添加音乐,首先添加背景音乐,点击摄像机,AddCommpent->aduio->aduiosource

 

首先 下载你需要的背景音乐,将音乐拖进Asset文件夹中,然后将音乐拖进刚才添加的aduiosource的中

然后 教你添加动作音效,在第一和代码中加入var music:AudioClip;

然后再发生子弹的那个方法中,AudioSource.PlayClipAtPoint(music,transform.position);播放,

六:挂载脚本

你首先将以第一个脚本,挂到摄像机上面,然后将第一个frefab(balls)拖到变量中

第二个脚本放在balls上,将fires和音乐拖到变量中!!

OK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 现在开火!!!!!!!!!

 

 

 

源码下载

没有更多推荐了,返回首页