節錄官方範例的script裡的method
private List<Animation> animationComponents;
private List<AudioSource> audioSourceComponents;
void HandleGamePauseRtGame(){
_GamePausePanel.SetActive(false);
StartCoroutine(Pause (false));
}
void HandleGamePauseOnPress(){
_GamePausePanel.SetActive(true);
//_GamePausePanel.transform.position = new Vector3(0,0,0);
StartCoroutine(Pause (true));
}
IEnumerator Pause (bool pause) {
// Pause/unpause time
Time.timeScale = (pause ? 0 : 1);
// Unlock/Lock cursor
Screen.lockCursor = !pause;
if (pause == true) {
Object[] objects = FindObjectsOfType(typeof(Animation));
animationComponents = new List<Animation>();
foreach (Object obj in objects) {
Animation anim = (Animation)obj;
if (anim != null && anim.enabled) {
animationComponents.Add(anim);
anim.enabled = false;
}
}
objects = FindObjectsOfType(typeof(AudioSource));
audioSourceComponents = new List<AudioSource>();
foreach (Object obj in objects) {
AudioSource source = (AudioSource)obj;
if (source != null && source.enabled /*&& source.isPlaying*/) {
audioSourceComponents.Add(source);
source.Pause();
}
}
}
else {
// If unpausing, wait one frame before we enable animation component.
// Procedural adjustments are one frame delayed because first frame
// after being paused has deltaTime of 0.
yield return 0;
foreach (Animation anim in animationComponents)
anim.enabled = true;
foreach (AudioSource source in audioSourceComponents)
source.Play();
animationComponents = null;
}
}
2014年5月13日 星期二
2014年4月27日 星期日
[Unity3D] 好站連結
【NGUI】
(Data Binding) NGUI 3.5.6
(Data Binding) NGUI 3.5.6
(UIPopupList)
http://blog.csdn.net/u012091672/article/details/17220923
http://www.unitymanual.com/blog-10712-138.html
【優化】
unity3d For IOS 模型优化
【Shader】
猫都能学会的Unity3D Shader入门指南(一)
http://blog.csdn.net/u012091672/article/details/17220923
http://www.unitymanual.com/blog-10712-138.html
【優化】
unity3d For IOS 模型优化
【Shader】
猫都能学会的Unity3D Shader入门指南(一)
2014年4月24日 星期四
[Unity3D] animation material 動畫材質的作法
我這邊寫了一個class,還不夠完美,先湊合著用吧^^
=========================================================
using UnityEngine;
using System.Collections;
public class AnimPlane : MonoBehaviour {
public Texture[] frames;
public bool loop = false;
public float delayTime = 0.01f;
public bool bAlwaysFaceToUser = false;
Quaternion offset=Quaternion.Euler(-90, 0, 0);
Transform cam;
bool bEnableAnim = false;
void Start () {
}
// Use this for initialization
protected void Init(){
gameObject.SetActive(false);
cam=Camera.main.transform;
}
// Update is called once per frame
void Update () {
if(bAlwaysFaceToUser){
Quaternion rot=cam.rotation*offset;
transform.rotation=rot;
Vector3 dirRight=transform.TransformDirection(-Vector3.right);
}
}
public void PlayAnim()
{
gameObject.SetActive(true);
bEnableAnim = true;
StartCoroutine(IEPlayAnim());
}
public void StopAnim()
{
bEnableAnim = false;
StopCoroutine("IEPlayAnim");
gameObject.SetActive(false);
}
IEnumerator IEPlayAnim()
{
int index = 0;
while(bEnableAnim)
{
renderer.material.mainTexture = frames[index];
index++;
if(index >= frames.Length) {
if(loop) index = 0;
else{
gameObject.SetActive(false);
break;
}
}
//yield return null;
yield return new WaitForSeconds(delayTime);
}
}
}
=========================================================
using UnityEngine;
using System.Collections;
public class AnimPlane : MonoBehaviour {
public Texture[] frames;
public bool loop = false;
public float delayTime = 0.01f;
public bool bAlwaysFaceToUser = false;
Quaternion offset=Quaternion.Euler(-90, 0, 0);
Transform cam;
bool bEnableAnim = false;
void Start () {
}
// Use this for initialization
protected void Init(){
gameObject.SetActive(false);
cam=Camera.main.transform;
}
// Update is called once per frame
void Update () {
if(bAlwaysFaceToUser){
Quaternion rot=cam.rotation*offset;
transform.rotation=rot;
Vector3 dirRight=transform.TransformDirection(-Vector3.right);
}
}
public void PlayAnim()
{
gameObject.SetActive(true);
bEnableAnim = true;
StartCoroutine(IEPlayAnim());
}
public void StopAnim()
{
bEnableAnim = false;
StopCoroutine("IEPlayAnim");
gameObject.SetActive(false);
}
IEnumerator IEPlayAnim()
{
int index = 0;
while(bEnableAnim)
{
renderer.material.mainTexture = frames[index];
index++;
if(index >= frames.Length) {
if(loop) index = 0;
else{
gameObject.SetActive(false);
break;
}
}
//yield return null;
yield return new WaitForSeconds(delayTime);
}
}
}
==========================================================
然後寫一個新的script繼承它
using UnityEngine;
using System.Collections;
public class RunnerSpray :AnimPlane {
// Use this for initialization
void Start () {
base.Init();
PlayAnim();
}
}
=========================================================
然後在unity editor裡建立一個plane
將RunnerSpray腳本拖ㄅ放到plane裡
再將多張texture依序拖放到Frames 底下
(這裡有個缺點,萬一圖片有幾百張不就拖到死了,暫時沒空去處理)
然後拖一張texture到這平面上
shader設定成 Mobile/Particles/Additive
設定大概參考圖片
然後執行一下Run
就能看到效果囉^^
[Unity3D] 關於character controller 的 isGrounded 的問題
原本是用
character.isGrounded 來判斷
但是自己使用的感想覺得不是非常準確
常常偵測不到
(當然可能是某個條件未滿足所造成的)
參考了這兩篇文章後
http://answers.unity3d.com/questions/424047/character-controller-isgroundedfalse-while-moving.html
http://answers.unity3d.com/questions/196381/how-do-i-check-if-my-rigidbody-player-is-grounded.html
整理出以下的方法
用Raycast去偵測
確實能work
參考看看^^
private float distToGround;
bool IsGrounded() {
//return Physics.Raycast(transform.position, -Vector3.up, distToGround + 0.1f);
return Physics.Raycast(transform.position, -Vector3.up, distToGround + 1.1f);
}
原本網友是用0.1f 但是我跑了以後偵測不到
可能跟每個人的collider大小有關
我調到1.1f後就能正常偵測了^^
character.isGrounded 來判斷
但是自己使用的感想覺得不是非常準確
常常偵測不到
(當然可能是某個條件未滿足所造成的)
參考了這兩篇文章後
http://answers.unity3d.com/questions/424047/character-controller-isgroundedfalse-while-moving.html
http://answers.unity3d.com/questions/196381/how-do-i-check-if-my-rigidbody-player-is-grounded.html
整理出以下的方法
用Raycast去偵測
確實能work
參考看看^^
private float distToGround;
bool IsGrounded() {
//return Physics.Raycast(transform.position, -Vector3.up, distToGround + 0.1f);
return Physics.Raycast(transform.position, -Vector3.up, distToGround + 1.1f);
}
原本網友是用0.1f 但是我跑了以後偵測不到
可能跟每個人的collider大小有關
我調到1.1f後就能正常偵測了^^
2014年4月22日 星期二
[Unity3D] [單位] 取得gameobject的單位大小
有時候你會想知道這個3d 物件在unity裡到底是佔有多大的單位(unit)
可以用此語法
gameObject.renderer.bounds.size (回傳值type是 vector3 )
可以用此語法
gameObject.renderer.bounds.size (回傳值type是 vector3 )
[Unity3D] [Sync MonoDevelop project 的作用] 解決 4.3.4版unity monodevelop 程式的autocomplete功能失效
自從將unity3d從4.2.1升級到4.3.4後
我發現我的monodevelop裡的程式的autocomplete的功能都失效了
這樣往後寫程式都很麻煩,要自己去找reference,
主要是因為這版的unity產生的project,
都沒有自動產生monodevelop相對應的sln文件,
因此造成用mono打開腳本後,
無法使用autocomplete的功能。
後來找到解決的方法
就是在unity editor裡 -> Assets -> Sync MonoDevelop Project
這樣回到你的unity project資料夾底下一看
就會發現相關的sln文件自動產生了
如此一來autocomplete功能也能正常使用囉^^
我發現我的monodevelop裡的程式的autocomplete的功能都失效了
這樣往後寫程式都很麻煩,要自己去找reference,
主要是因為這版的unity產生的project,
都沒有自動產生monodevelop相對應的sln文件,
因此造成用mono打開腳本後,
無法使用autocomplete的功能。
後來找到解決的方法
就是在unity editor裡 -> Assets -> Sync MonoDevelop Project
這樣回到你的unity project資料夾底下一看
就會發現相關的sln文件自動產生了
如此一來autocomplete功能也能正常使用囉^^
2014年4月21日 星期一
[Unity3D] (native plugins) 用unity 取得IDFA 的方法
首先參考了這兩篇的文章
另外要知道 objective-c 取得IDFA的語法 :
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
1. 你要先確定你的程式在xcode底下是可以正確build不會出錯的
2. 把xcode寫好的程式碼移到 unity專案底下的 Assets -> Plugins ->iOS 底下(放在別地方沒有用)
3. 因為要取得IDFA需要 AdSupport.framework 所以在BonjourClientImpl.h
記得加入 #import <AdSupport/AdSupport.h>
所以整個BonjourClientImpl.h是長這樣
-----------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <AdSupport/AdSupport.h>
@interface NetServiceBrowserDelegate : NSObject
{
// Keeps track of available services
NSMutableArray *services;
// Keeps track of search status
NSString* status;
BOOL searching;
}
// NSNetServiceBrowser delegate methods for service browsing
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser;
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didNotSearch:(NSDictionary *)errorDict;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didFindService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didRemoveService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing;
// Other methods
- (int)getCount;
- (NSString*) getIDFA;
- (NSNetService *)getService:(int)serviceNo;
- (NSString *)getStatus;
@end
-------------------------------------------------------------------------------------------
然後 BonjourClientImpl.mm 是改成這樣:
-------------------------------------------------------------------------------------------
#import "BonjourClientImpl.h"
@implementation NetServiceBrowserDelegate
- (id)init
{
self = [super init];
services = [[NSMutableArray alloc] init];
searching = NO;
status = @"Initializing";
return self;
}
- (void)dealloc
{
[services release];
[super dealloc];
}
// Sent when browsing begins
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser
{
searching = YES;
status = @"Searching";
[services removeAllObjects];
}
// Sent when browsing stops
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser
{
searching = NO;
status = @"Done";
}
// Sent if browsing fails
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didNotSearch:(NSDictionary *)errorDict
{
searching = NO;
NSString * msg = @"Failed.";
status = [msg stringByAppendingString:[[errorDict objectForKey:NSNetServicesErrorCode] stringValue]];
}
// Sent when a service appears
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didFindService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing
{
[services addObject:aNetService];
}
// Sent when a service disappears
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didRemoveService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing
{
[services removeObject:aNetService];
}
- (int)getCount
{
return [services count];
}
- (NSString*) getIDFA
{
return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
- (NSNetService *)getService:(int)serviceNo
{
return [services objectAtIndex:serviceNo];
}
- (NSString *)getStatus
{
return status;
}
@end
static NetServiceBrowserDelegate* delegateObject = nil;
static NSNetServiceBrowser *serviceBrowser = nil;
// Converts C style string to NSString
NSString* CreateNSString (const char* string)
{
if (string)
return [NSString stringWithUTF8String: string];
else
return [NSString stringWithUTF8String: ""];
}
// Helper method to create C string copy
char* MakeStringCopy (const char* string)
{
if (string == NULL)
return NULL;
char* res = (char*)malloc(strlen(string) + 1);
strcpy(res, string);
return res;
}
// When native code plugin is implemented in .mm / .cpp file, then functions
// should be surrounded with extern "C" block to conform C function naming rules
extern "C" {
void _StartLookup (const char* service, const char* domain)
{
if (delegateObject == nil)
delegateObject = [[NetServiceBrowserDelegate alloc] init];
if (serviceBrowser == nil)
serviceBrowser = [[NSNetServiceBrowser alloc] init];
[serviceBrowser setDelegate:delegateObject];
// Call "searchForServicesOfType" and pass NSStrings as parameters. By default mono
// marshals all .Net strings as UTF-8 C style strings.
[serviceBrowser searchForServicesOfType: CreateNSString(service) inDomain: CreateNSString(domain)];
}
const char* _GetLookupStatus ()
{
// By default mono string marshaler creates .Net string for returned UTF-8 C string
// and calls free for returned value, thus returned strings should be allocated on heap
return MakeStringCopy([[delegateObject getStatus] UTF8String]);
}
int _GetServiceCount ()
{
return [delegateObject getCount];
}
const char* _GetIDFA()
{
return MakeStringCopy([[delegateObject getIDFA] UTF8String]);
}
const char* _GetServiceName (int serviceNumber)
{
// By default mono string marshaler creates .Net string for returned UTF-8 C string
// and calls free for returned value, thus returned strings should be allocated on heap
return MakeStringCopy([[[delegateObject getService:serviceNumber] name] UTF8String]);
}
void _Stop()
{
[serviceBrowser stop];
}
}
-------------------------------------------------------------------------------------------
因為是obj-c++ 所以為了要讓unity script 可以呼叫到,
被unity呼叫的function必須包在 extern "C" { } 裡面才呼叫的到
然後用_GetIDFA() 去呼叫 obj-c 的方法 getIDFA
這樣xcode要寫的部分就完成了
再來講一下Plugins底下的Bonjour.cs 這隻程式
官方是建議寫一隻獨立的class來跟native ios做溝通
所以才會有這隻Bonjour.cs
一樣我在這隻程式底下加了這行
[DllImport ("__Internal")]
private static extern string _GetIDFA ();
然後再加了個方法
public static string GetIDFA(){
return _GetIDFA ();
}
最後就是主程式 BonjourTest.js
我在function OnGUI () 的最後加入了這行
//jojospeed666
print("IDFA = "+Bonjour.GetIDFA());
//Display IDFA
GUI.Label(new Rect(centerx - 50, 175, 100, 25), "IDFA = "+Bonjour.GetIDFA(), labelStyle);
這樣一來程式部分都改寫完畢
然後去unity build專案
沒出錯的話它會要求你新建一個Xcode專案
把它存在你想存的地方,等build好後去把那專案開啟
這邊要記得做一件很重要的事
就是要去xcode那邊把 AdSupport.framework 這個import進來
而且每次unity build完 打開xcode都要重做一次
不然run xcode會報錯
不知道unity有沒有地方可以設定build好就自動讓xcode import好會用到的
framework呢? 有同學知道的話麻煩告知一下
不然就只能用我這蠢方法
每次unity build好 進xcode後又要在import一次
沒問題後就run看看吧
手機自動開啟unity app後,點下qurey 看看下方是否有出現IDFA,
如果有的話就表示成功取得IDFA囉^^
sample下載位置
Building Plugins for iOS
(進去下載 Bonjour Browser Sample 來修改 )
然後再參考這篇
Unity- 实现 Building Plugins for iOS(含Demo)另外要知道 objective-c 取得IDFA的語法 :
[[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
1. 你要先確定你的程式在xcode底下是可以正確build不會出錯的
2. 把xcode寫好的程式碼移到 unity專案底下的 Assets -> Plugins ->iOS 底下(放在別地方沒有用)
3. 因為要取得IDFA需要 AdSupport.framework 所以在BonjourClientImpl.h
記得加入 #import <AdSupport/AdSupport.h>
所以整個BonjourClientImpl.h是長這樣
-----------------------------------------------------------------------------------------
#import <Foundation/Foundation.h>
#import <AdSupport/AdSupport.h>
@interface NetServiceBrowserDelegate : NSObject
{
// Keeps track of available services
NSMutableArray *services;
// Keeps track of search status
NSString* status;
BOOL searching;
}
// NSNetServiceBrowser delegate methods for service browsing
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser;
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didNotSearch:(NSDictionary *)errorDict;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didFindService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing;
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didRemoveService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing;
// Other methods
- (int)getCount;
- (NSString*) getIDFA;
- (NSNetService *)getService:(int)serviceNo;
- (NSString *)getStatus;
@end
-------------------------------------------------------------------------------------------
然後 BonjourClientImpl.mm 是改成這樣:
-------------------------------------------------------------------------------------------
#import "BonjourClientImpl.h"
@implementation NetServiceBrowserDelegate
- (id)init
{
self = [super init];
services = [[NSMutableArray alloc] init];
searching = NO;
status = @"Initializing";
return self;
}
- (void)dealloc
{
[services release];
[super dealloc];
}
// Sent when browsing begins
- (void)netServiceBrowserWillSearch:(NSNetServiceBrowser *)browser
{
searching = YES;
status = @"Searching";
[services removeAllObjects];
}
// Sent when browsing stops
- (void)netServiceBrowserDidStopSearch:(NSNetServiceBrowser *)browser
{
searching = NO;
status = @"Done";
}
// Sent if browsing fails
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didNotSearch:(NSDictionary *)errorDict
{
searching = NO;
NSString * msg = @"Failed.";
status = [msg stringByAppendingString:[[errorDict objectForKey:NSNetServicesErrorCode] stringValue]];
}
// Sent when a service appears
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didFindService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing
{
[services addObject:aNetService];
}
// Sent when a service disappears
- (void)netServiceBrowser:(NSNetServiceBrowser *)browser
didRemoveService:(NSNetService *)aNetService
moreComing:(BOOL)moreComing
{
[services removeObject:aNetService];
}
- (int)getCount
{
return [services count];
}
- (NSString*) getIDFA
{
return [[[ASIdentifierManager sharedManager] advertisingIdentifier] UUIDString];
}
- (NSNetService *)getService:(int)serviceNo
{
return [services objectAtIndex:serviceNo];
}
- (NSString *)getStatus
{
return status;
}
@end
static NetServiceBrowserDelegate* delegateObject = nil;
static NSNetServiceBrowser *serviceBrowser = nil;
// Converts C style string to NSString
NSString* CreateNSString (const char* string)
{
if (string)
return [NSString stringWithUTF8String: string];
else
return [NSString stringWithUTF8String: ""];
}
// Helper method to create C string copy
char* MakeStringCopy (const char* string)
{
if (string == NULL)
return NULL;
char* res = (char*)malloc(strlen(string) + 1);
strcpy(res, string);
return res;
}
// When native code plugin is implemented in .mm / .cpp file, then functions
// should be surrounded with extern "C" block to conform C function naming rules
extern "C" {
void _StartLookup (const char* service, const char* domain)
{
if (delegateObject == nil)
delegateObject = [[NetServiceBrowserDelegate alloc] init];
if (serviceBrowser == nil)
serviceBrowser = [[NSNetServiceBrowser alloc] init];
[serviceBrowser setDelegate:delegateObject];
// Call "searchForServicesOfType" and pass NSStrings as parameters. By default mono
// marshals all .Net strings as UTF-8 C style strings.
[serviceBrowser searchForServicesOfType: CreateNSString(service) inDomain: CreateNSString(domain)];
}
const char* _GetLookupStatus ()
{
// By default mono string marshaler creates .Net string for returned UTF-8 C string
// and calls free for returned value, thus returned strings should be allocated on heap
return MakeStringCopy([[delegateObject getStatus] UTF8String]);
}
int _GetServiceCount ()
{
return [delegateObject getCount];
}
const char* _GetIDFA()
{
return MakeStringCopy([[delegateObject getIDFA] UTF8String]);
}
const char* _GetServiceName (int serviceNumber)
{
// By default mono string marshaler creates .Net string for returned UTF-8 C string
// and calls free for returned value, thus returned strings should be allocated on heap
return MakeStringCopy([[[delegateObject getService:serviceNumber] name] UTF8String]);
}
void _Stop()
{
[serviceBrowser stop];
}
}
-------------------------------------------------------------------------------------------
因為是obj-c++ 所以為了要讓unity script 可以呼叫到,
被unity呼叫的function必須包在 extern "C" { } 裡面才呼叫的到
然後用_GetIDFA() 去呼叫 obj-c 的方法 getIDFA
這樣xcode要寫的部分就完成了
再來講一下Plugins底下的Bonjour.cs 這隻程式
官方是建議寫一隻獨立的class來跟native ios做溝通
所以才會有這隻Bonjour.cs
一樣我在這隻程式底下加了這行
[DllImport ("__Internal")]
private static extern string _GetIDFA ();
然後再加了個方法
public static string GetIDFA(){
return _GetIDFA ();
}
最後就是主程式 BonjourTest.js
我在function OnGUI () 的最後加入了這行
//jojospeed666
print("IDFA = "+Bonjour.GetIDFA());
//Display IDFA
GUI.Label(new Rect(centerx - 50, 175, 100, 25), "IDFA = "+Bonjour.GetIDFA(), labelStyle);
這樣一來程式部分都改寫完畢
然後去unity build專案
沒出錯的話它會要求你新建一個Xcode專案
把它存在你想存的地方,等build好後去把那專案開啟
這邊要記得做一件很重要的事
就是要去xcode那邊把 AdSupport.framework 這個import進來
而且每次unity build完 打開xcode都要重做一次
不然run xcode會報錯
不知道unity有沒有地方可以設定build好就自動讓xcode import好會用到的
framework呢? 有同學知道的話麻煩告知一下
不然就只能用我這蠢方法
每次unity build好 進xcode後又要在import一次
沒問題後就run看看吧
手機自動開啟unity app後,點下qurey 看看下方是否有出現IDFA,
如果有的話就表示成功取得IDFA囉^^
sample下載位置
2014年4月15日 星期二
[Unity3D] 找尋gameobject的child gameobject
[實作]
ObjectUltility.FindChildTransform
public static Transform FindChildTransform(Transform root ,string name ){
if (root == null) {
return null;
} else if (root.name == name) {
return root;
}
foreach(Transform child in root) {
Transform childResult = FindChildTransform(child, name);
if (childResult != null) {
return childResult;
}
}
return null;
}
[用法]
GameObject flashLight;
flashLight = ObjectUltility.FindChildTransform( transform , "flashLight").gameObject;
ObjectUltility.FindChildTransform
public static Transform FindChildTransform(Transform root ,string name ){
if (root == null) {
return null;
} else if (root.name == name) {
return root;
}
foreach(Transform child in root) {
Transform childResult = FindChildTransform(child, name);
if (childResult != null) {
return childResult;
}
}
return null;
}
[用法]
GameObject flashLight;
flashLight = ObjectUltility.FindChildTransform( transform , "flashLight").gameObject;
2014年3月27日 星期四
[Unity3D] 基礎教學 中文 影片
Unity官方教學 - 物理篇
http://goo.gl/UIVrDD
Unity官方教學 - 圖形篇
http://goo.gl/dRqzD1
Unity官方教學 - 編輯器篇
http://goo.gl/HeTMFt
2014年2月11日 星期二
[Unity3D] NGUI text 修改文字顏色的語法
作法:
[色碼]要換顏色的文字[-]
線上色碼轉換網址
http://rhinejo.myweb.hinet.net/home/color/csrf.html
範例:
[FFFFF00]所持晶礦:999,999,999個[-]
[FFFFF00]可抽999,999,999次[-]
[色碼]要換顏色的文字[-]
線上色碼轉換網址
http://rhinejo.myweb.hinet.net/home/color/csrf.html
範例:
[FFFFF00]所持晶礦:999,999,999個[-]
[FFFFF00]可抽999,999,999次[-]
圖片參考:
2013年12月18日 星期三
[Unity3D] Asset Store 簡介 - (入門篇)
前言:
使用unity 3d engine 開發3D遊戲時,有時候會發現引擎所提供的功能不敷使用,需要自行編寫程式將功能強化, 又或著是開發者本身不具備3D 建模的技能時,這時候就可以來unity官方的asset store 挖寶, 看看有沒有符合自身需求的插件或是美術資源可以下載使用。 如此以來可以大幅節省開發的時間,對於開發人數少的遊戲工作室,或是資源有限的開發部門特別有用。
資源商店(asset store)的分類:
目前的分類大致如圖所示,也許未來會更改也說不定,一切分類已官方為準唷,
接下來對各類別做一個簡單的介紹。
[3D Models]
裡面有各種不同類型的3D 模型的完成品,您可以下載下來直接使用,大部分畫得比較有水準的都是需要收費的,如果只是想拿來練習,可以找一些免費的來下載。 各種分類底下還會有細部分類,礙於篇幅,小弟會在之後抽空為大家介紹。
[Animation]
當你畫好3d模型後,也許會需要他能夠做動作,因為畢竟是遊戲,裡面大部分的3d人物都需要有相對應的動作的,例如主角需要會走路,會跑步,會跳躍,會攻擊怪物,這些動作,都去要去繪製動畫,才能讓主角在遊戲裡能動起來,如果我們不是專業的動畫師,可能就需要來這邊找一些animation插件來套用到我們的3d模型裡,這樣能幫我們節省不少開發的時間,
並不是所有的animation都會符合我們的需求,因此可能下載下來後還需要做一些微調。
當然做的比較精細的動畫插件還是需要收費的^^
[Audio]
任何遊戲裡都需要音樂,音效,因此除了找專業的錄音室提供以外,也能夠來這裡看看有沒有適合自己遊戲的音效喔,大部分都要收費的。
[Complete Projects]
對於初學者想要從頭開始寫一款遊戲多少會有一些困惑,不知道從何開始,或者是想要參考別人的遊戲程式架構是如何撰寫的,都可以來這邊挖寶,這裡提供很多完整的遊戲例子,包括程式與美術資源整合成一整包(package),下載下來能夠看到原始程式碼,因此可以學到不少東西,
有一些不錯的project雖然要付費,但是如果能從中學到許多技巧,其實是很划算的^^
[Editor Extensions]
這裡放了很多unity editor的功能擴充插件,讓您在使用編輯器開發遊戲時,擴充您的編輯器功能, 能夠更加方便有效率地開發。
最有名的例子就是NGUI插件,
unity內建的UI編輯工具 ,功能很陽春,而且消耗的資源比較多,如果使用多了,會讓遊戲運作的速度比較慢,簡單的講就是會讓你的遊戲lag阿~
lag的遊戲玩家是無法接受的,
因此可以考慮第三方製作的插件: NGUI,不但功能強大,消耗的資源也比較低,雖然要1百多塊美金,但是考慮到他的功能實用性,其實不算貴的,推薦給大家使用。
[Particle Systems]
遊戲裡往往會需要爆炸,煙霧,火花等特效,如果不想自己製作,可以來這邊下載,可以省下很多時間喔^^
[Scripting]
這裡大概是工程師的最愛吧 XD
裡面有很多插件讓工程師可以快速將某些功能實現,
例入手機裡的手指操作(手勢判斷),虛擬搖桿,動作RPG的跳動數字,這裡都有不少相關的插件可以下載,省下很多開發的時間喔^^
[Services]
在開發遊戲時,我們可以利用unity內建的stat或是profiler(pro版的才有)這些工具來分析我們的程式是否有隱藏的問題,例如記憶體溢存,或是在運行中的某個時間點出現嚴重的lag,雖然未導致遊戲當機,但是要找出這類的問題就需要用到這些工具,所以如果內建的工具功能不夠您使用,可以再進入這裡找尋其他適合您的插件來使用。
[Shaders]
遊戲裡的各種3d物件的貼圖,如果想要加上各種特效,就需要shader,例如高光,鏡面反射,bump map,卡通畫風的人物,都會需要用到shader,如果不想自己花時間去製作,可以來這裡下載,節省時間。
[Textures & Materials]
遊戲的3d物件畫好了,就需要製作貼圖貼到3d物件上,才能讓3d模型更加真實,例如人類的皮膚,或是機器人身上生鏽的紋路,都必須製作材質與貼圖貼上去,因此如果不想自行繪製,可以來這邊找尋是否有合適的貼圖,節省時間^^
結語:
其實asset store 簡單地說就是一個節省開發時間的一個插件販售商店,對於大型的遊戲開發公司,擁有充足的資源,可能比較不需要,但是對於小型的工作室或開發團隊,想要在合理的時間開發出比較精緻的遊戲,就會需要來這裡找尋資源了。
訂閱:
文章 (Atom)



