1. 程式人生 > >真Unity3d_C#基本語法1

真Unity3d_C#基本語法1

其實我寫C#有好多年,我也不用太謙虛,估計這裡寫C#沒人比我早,因為我從.net 1.0開始寫的

但原來很多語法我都不會,相反一些商業遊戲框架裡面蘊含的語法,寫這些程式碼的人對C#的掌握程度反而讓我驚豔

1.注入

注入的意思就是注入,也不知道怎麼解釋好,反正JAVA語法直譯也就是這個意思

例如下面的程式碼,其實如果vp_itemPickup這個類需要用到collider這個component的,這樣寫之後捏,在unity editor新增Component: itemPickup的時候,直接同時會把collider,注入完成(也就是載入的前一刻,載入完成所需前置的類,也就能完全呼叫前置類的實現方法,而這個前置類不是在unity editor ,而是發起注入的這個源類決定的,甚至是動態決定的, 或者某個配置檔案裡面寫死的, 主要也就是需要載入前一刻才“注入”的效果)

RequireComponent 真的是很棒,相當於注入

其實[]這樣的寫法,我當時學C#的時候已經是相當於JAVA的注入

C#這麼寫

[System.Serializable]
public class vp_Item

而Java這麼寫

@Serializable
public class vp_Item


其實我暫時還不知道System.Serializable有什麼用,之前看過好像是序列化之後,UnityEditor能直接用,太晚了今天,所以不好意思,後面再補上吧

[RequireComponent(typeof(SphereCollider))]
[System.Serializable]
public class vp_ItemPickup : MonoBehaviour

我不得不記錄下這樣的注入寫法,注入並不是一個方法或實現,他在C#裡真的就是標籤 | 特性,並沒有具體實現,但就是說明要注入這麼一個特性(不止是標籤,是一些特性的實現)

/// <summary>
/// 
/// </summary>
public class vp_ItemAmountAttribute : PropertyAttribute
{

	public vp_ItemAmountAttribute()
	{
	}

}

/// <summary>
/// 
/// </summary>
[CustomPropertyDrawer(typeof(vp_ItemAmountAttribute))]
public class vp_ItemAmountDrawer : PropertyDrawer
{
//這裡有不少邏輯程式碼,篇幅問題,沒列出來
}
上面的程式碼對於
vp_ItemAmountAttribute 我的理解就是把
vp_ItemAmountDrawer 注入到 
CustomPropertyDrawer 裡

2.作用域和虛擬函式

protected(保護方法)就是所有繼承這個類的類都能呼叫該方法,無法在外部呼叫,外部類甚至見不到這個方法,

virtual(虛擬函式)就是繼承這個類的類都能重寫這個方法,這個類的子類同樣能命名方法,如:private void InputAttack(),這個類的這個虛方法就不會被執行,而直接執行子類的InputAttack()方法

protected virtual void InputAttack()
{
// TIP: 這個方法已經有一個實現了
}


最後,想法就是有這麼一個配置問題檔案,我需要一個傷害值的計算公式

<info un32ID="1200501">
		<szName>瞬刺等級1</szName>
		<CameraType>0</CameraType>
		<SkillType>2,5</SkillType>
		<bIsInstant>0</bIsInstant>
		<bIfNormalAttack>0</bIfNormalAttack>
		<bIsConsumeSkill>0</bIsConsumeSkill>
		<eSummonEffect>0</eSummonEffect>
		<eEffectiveAttackWay>0</eEffectiveAttackWay>
		<eReleaseWay>2</eReleaseWay>
		<n32UpgradeLevel>1</n32UpgradeLevel>
		<n32UseMP>30</n32UseMP>
		<n32UseHP>0</n32UseHP>
		<n32UseCP>0</n32UseCP>
		<n32PrepareAction>0</n32PrepareAction>
		<n32PrepareTime>0</n32PrepareTime>
		<n32PrepareEffect>0</n32PrepareEffect>
		<n32PrepareSound>0</n32PrepareSound>
		<n32ReleaseAction>skill</n32ReleaseAction>
		<n32ReleaseSound>0</n32ReleaseSound>
		<n32ReleaseTime>270</n32ReleaseTime>
		<n32CoolDown>12000</n32CoolDown>
		<n32SkillLastTime>0</n32SkillLastTime>
		<n32ReleaseDistance>900</n32ReleaseDistance>
		<eUseWay>1</eUseWay>
		<n32TriggerRate>1000</n32TriggerRate>
		<bIfAffectBuilding>0</bIfAffectBuilding>
		<bIfAffectHero>1</bIfAffectHero>
		<bIfAffectMonster>1</bIfAffectMonster>
		<affectString></affectString>
		<eTargetType>5</eTargetType>
		<bIsCheckTargetSta>1</bIsCheckTargetSta>
		<SkillIcon>05</SkillIcon>
		<info>瞬間移動至目標位置,可以對友方單位使用</info>
		<EventID>170003</EventID>
	</info>


看到這麼一串數字,其實有點暈,因為這樣的配置表還有很多

當然我可以再加幾個elements,例如hp attack, physic attack那要再+幾個elements才夠呢,如果策劃又說改攻擊力計算公式,是不是又再加elements

所以最好做成一個公式(字串),讓他們自己改去吧

大概最後做成

public class SkillManagerConfig
{
	/// <summary>
	/// 後新增的,創傷公式字串
	/// 做成可程式設計式字串(雖然可能只是替換)
	/// 用entity的物理攻擊,法術攻擊等替換公式字串的內容
	/// </summary>
	public string affectString;

}


這只是開頭,我好像也不記得什麼語法能做這個,

正則表示式?

還是Convert.toString?

有知道什麼C#語法比較好做這種語法字串(學術上好像叫,語意轉換)的小夥伴在麼?

如果你想要知道一點C#基本語法,其實1,2本書就夠了,包含幾乎所有語法,我也可以介紹給你,還是10年前1.0的書