2016-02-05 14:50:39 u012741077 阅读数 554

如果要在Unity3D中接入Window Phone(以下简称WP)的广告SDK,则需要用到WP与Unity3D之间的消息传递。
本文将创建一个简单工程,有需要的人可以以此类推。
本工程主要功能实现了Unity3D中按钮事件传递到WP工程中,且在WP工程中对该按钮的颜色进行随机调整。
接下来就是正文,一步步来!

  • 先创建一个Unity3D的工程,并导入NGUI(尝试了下UGUI,结果WP中不响应,不知道为什么,有空再研究吧!)。
  • 创建一个WP与Unity3D交互用对象“Test”,然后附加上一个“Test”脚本。代码如下。
using UnityEngine;
using System.Collections;
using System;
using UnityEngine.UI;

public class Test : MonoBehaviour {

    public event Action<int> onClickEvent;
    public int _clickCnt;
    public UILabel btnName;
    // Use this for initialization
    void Start () {
        _clickCnt = 0;
    }

    // Update is called once per frame
    void Update () {
    }

    public void OnClick()
    {
        ++_clickCnt;
        if (onClickEvent != null)
        {
            onClickEvent(_clickCnt);
        }
        btnName.text = _clickCnt + "次";
    }
}
  • 然后创建一个按钮,本人比较懒,名字就不改了,默认为“Control - Simple
    Button”。然后将“Test”脚本附加到单机事件中,响应函数为“onClick”。如下。

示例

  • Unity3D的工程处理就到此结束了,接下来生成WP工程。因为本人使用的是Unity3D
    5.3.1f1,在此版本中WP8已经被移除了,所以我们生成WP8.1的工程或者UWP的工程都可以,本人生成的是WP8.1的工程。如下:

示例

  • 打开WP8.1的工程,修改“MainPage.xaml.cs”文件。只对原有工程中的“MainPage”函数做了修改,然后添加了“UnityInitialized”、“InitOnAppThread”、“OnClick”三个函数,所以我只列出这几个。
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            AppCallbacks appCallbacks = AppCallbacks.Instance;
            //...省略上面未修改部分
            //添加初始化完成回调函数
            appCallbacks.Initialized += UnityInitialized;//注册初始化完成事件
            //...省略下面未修改部分
        }

        private void UnityInitialized()
        {
            AppCallbacks appCallbacks = AppCallbacks.Instance;

            //在主线程初始化
            if (appCallbacks.RunningOnAppThread())
            {
                InitOnAppThread();
            }
            else
            {//如果在非主线程,则转到主线程执行
                appCallbacks.InvokeOnAppThread(new AppCallbackItem(InitOnAppThread), true);
            }
        }

        private void InitOnAppThread()
        {
            //查找通信对象
            UnityEngine.GameObject test = UnityEngine.GameObject.Find("Test");
            if (test == null)
            {//未找到
                return;
            }

            Test testscritp = test.GetComponent<Test>();
            if (testscritp == null)
            {//未找到
                return;
            }

            //添加按钮响应事件
            testscritp.onClickEvent += OnClick;
        }

        private void OnClick(int num)
        {
            //查找对象按钮对象
            UnityEngine.GameObject obj = UnityEngine.GameObject.Find("Control - Simple Button");
            if (obj == null)
            {//未找到
                return;
            }
            UIButton btn = obj.GetComponent<UIButton>();
            if (btn == null)
            {//未找到
                return;
            }
            //随机修改一个颜色
            btn.defaultColor = UnityEngine.Random.ColorHSV();
        }
        //...省略下面未修改部分
    }
  • 至此代码修改完成,生成部署一个!效果如下。

    示例

以上方式就可以在WP工程中响应Unity3D中的事件。
创建一个通信用的对象,并且要一直存在,不能被销毁。
如果读者有什么不懂的,敬请留言~

这里写图片描述

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

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







完成!

2015-08-14 10:23:25 u010024824 阅读数 3086

Null Reference Exception : Object reference not set to an instance of an object.

异常:空引用,对象的引用未设置到对象的实例。

出现该异常的位置:

可能是在调用组件时该组件还未实例化或未存储地址指针,需要查看是否将组件位置拽入代码公布的字段;还有注意Unity3D的生命周期,调整代码的执行顺序。




(若有错误和不足之处,还望指正,谢谢!)

2019-09-20 18:00:29 cccxxmo 阅读数 38
  1. 基本操作演练
  • 下载 Fantasy Skybox FREE, 构建自己的游戏场景

  • 写一个简单的总结,总结游戏对象的使用

游戏对象的生成:游戏对象可以通过代码动态生成,也可以直接在Unity3D的界面中创建生成。

改变游戏对象的状态(动作、位移等):通过在代码中调整相应的参数改变游戏对象的状态。

游戏对象的部件:在Unity3D的界面中可以添加游戏对象的部件,如声音、效果、事件、UI、视频等。

2、编程实践

牧师与魔鬼 动作分离版

2016-03-27 15:05:34 MAOMAOXIAOHUO 阅读数 6049

使用RGB的十六进制来设置颜色,在工作中减少了颜色的输入次数。在项目使用开发同事从美术同事拿到的颜色表基本上都以十六进制来表示。

本人目前用版本为Unity3d4.6.7,未发现在Color面板中能进行十六进制颜色转换,也未发现能通过编写扩展代码调整Color在Inspector中的GUI显示。

  • Unity3d4.6.7
  • NGUI3.8.2

下文假设你已经对Untiy3dEditor.Editor和NGUI有基本认识

NGUI作用Unity3d最为热门的UI插件,大部分控件继承基类UIWidget,且已包含了Color属性。下文将修改UIWidgetInspector.cs,将RGB转换为十六进制,并且可以UIWidget的Inspector面板中转换
这里写图片描述
*最终结果如下图
这里写图片描述

—java
UIWidgetInspector.cs找到如下方法

    static public void DrawColor (SerializedObject so, UIWidget w)
    {
        if ((w.GetType() != typeof(UIWidget)))
        {
            NGUIEditorTools.DrawProperty("Color Tint", so, "mColor", GUILayout.MinWidth(20f));
        }
        else if (so.isEditingMultipleObjects)
        {
            NGUIEditorTools.DrawProperty("Alpha", so, "mColor.a", GUILayout.Width(120f));
        }
        else
        {
            GUI.changed = false;
            float alpha = EditorGUILayout.Slider("Alpha", w.alpha, 0f, 1f);

            if (GUI.changed)
            {
                NGUIEditorTools.RegisterUndo("Alpha change", w);
                w.alpha = alpha;
            }
        }
    }

调整为如下

// 记录是否使用十六进制
static bool hexColor = false;
static public void DrawColor (SerializedObject so, UIWidget w)
    {
        if ((w.GetType() != typeof(UIWidget)))
        {
            Color color = w.color;
            hexColor = EditorGUILayout.Toggle("HexColor", hexColor);
            if (hexColor)
            {
                Color32 c32 = (Color32) w.color;
                string hex = EditorGUILayout.TextField(string.Format("{0:X2}{1:X2}{2:X2}", c32.r, c32.g, c32.b));

                if (hex.Length >= 6)
                {
                    byte r = 0;
                    byte g = 0;
                    byte b = 0;

                    byte.TryParse(hex.Substring(0, 2), System.Globalization.NumberStyles.HexNumber, null, out r);
                    byte.TryParse(hex.Substring(2, 2), System.Globalization.NumberStyles.HexNumber, null, out g);
                    byte.TryParse(hex.Substring(4, 2), System.Globalization.NumberStyles.HexNumber, null, out b);

                    so.FindProperty("mColor").colorValue = new Color32(r, g, b, c32.a);
                }
            }
            else
            {
                NGUIEditorTools.DrawProperty("Color Tint", so, "mColor", GUILayout.MinWidth(20f));
            }
        }
        else if (so.isEditingMultipleObjects)
        {
            NGUIEditorTools.DrawProperty("Alpha", so, "mColor.a", GUILayout.Width(120f));
        }
        else
        {
            GUI.changed = false;
            float alpha = EditorGUILayout.Slider("Alpha", w.alpha, 0f, 1f);

            if (GUI.changed)
            {
                NGUIEditorTools.RegisterUndo("Alpha change", w);
                w.alpha = alpha;
            }
        }
    }

到目前为此我们只是仅仅为NGUI UIWidget基类的控件增加了十六进制颜色格式转换。并没有在Unity3d更底层的地方进入修改。最根本办法 ,我希望能直接做在Unity3d Color面板里面
这里写图片描述

================2016-6-4===========================
发现Unity3d 5.3.3版本已有十六进制的颜色转换了。至于哪个开始有,没去考究。如下图是Unity3d 5.3.3是的Color面板
这里写图片描述

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