【GamePlay】入門篇

【GamePlay】入門篇

游戲性編程是指通過一系列游戲系統將游戲想法變成現實的過程。

本次的簡例以NPC設計為主。

通常在進行腳本設計前,對NPC的屬性進行基本的添加和設定,諸如動畫系統、物理系統等等。

1.動畫系統

添加Animator組件,綁定骨骼。

創建Animator Controller文件,將之添加到組件的Controller部分。

打開Controller,考慮動畫組件的主體需要實現什么功能。

以此例的NPC為例,需要實現他的移動功能。

所以在Controller中添加新的混合樹命名為Locomotion(移動)。

打開混合樹,為其添加三種不同的運動狀態(空閑、走路、奔跑),并綁定相應的動畫文件。

調整三個狀態之間的數值階段,初始為0:0.5:1,調整為0:1:8。

(這里的意義在于更流暢的移動體驗,休閑到走路快速的過渡,走路到奔跑則需要速度到達一定閾值后才能切換。)

備注:

取消勾選Autonate Thresholds后,可以更改數值。

parameter是用于腳本中調用setFloat方法中的參數名,從而在動畫間不斷的切換。

【2】Player腳本

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class PlayerMovement : MonoBehaviour
{public float moveSpeed;private Vector3 moveInput;private Vector3 moveVelocity;private Rigidbody rd;private Camera mainCamera;private Animator animator;// Start is called before the first frame updatevoid Start(){rd = GetComponent<Rigidbody>();mainCamera = Camera.main;animator = GetComponent<Animator>();}// Update is called once per framevoid Update(){float lh = Input.GetAxis("Horizontal");//輸入的是左右,即X軸數據,對應著AD鍵位。float lv = Input.GetAxis("Vertical");//輸入的是上下,即Z軸的數據,對應著WS鍵位。
       moveInput =new Vector3(lh,0f,lv);//一個即時的向量,當無輸入時是零向量。//在Unity中,人物面朝的方向是藍軸,即Z軸;沿著人物雙手方向的橫軸是紅軸,即X軸;||而沿著人物垂心的是綠軸,即Y軸。Vector3 cameraForword = mainCamera.transform.forward;//主相機在沿著z軸的矢量位置和方向
        cameraForword.y = 0;Quaternion s = Quaternion.FromToRotation(Vector3.forward, cameraForword);//這個四元素包含了(0,0,1)到cameraForword的旋轉信息
        Vector3 lookToward = s * moveInput;//四元數和向量相乘表示這個向量按照這個四元數進行旋轉之后得到的新的向量。if (moveInput.sqrMagnitude>0){Ray ray = new Ray(transform.position,lookToward);//transform.position為該腳本對應的對象的位置
           transform.LookAt(ray.GetPoint(1));//transform.LookAt:旋轉自身,使得當前對象的正z軸指向目標對象target所在的位置(使對象朝向目標點)//ray.GetPoint(1):獲取一個沿著向量方向距離X的點
        }moveVelocity = transform.forward*moveSpeed* moveInput.sqrMagnitude;//transform.forward給的是人物坐標軸Z軸的矢量方向,即面朝的方向//(自動對物體旋轉值算出前進方向向量的變量,vector3.forward則不計算旋轉值,所以vector3.forward固定為(0,0,1))//moveVector3.sqrMagnitude返回是坐標軸輸入矢量的平方長度的Float數值,用于控制速度,當無輸入時,速度為0。
        Aniamting();}void FixedUpdate(){rd.velocity = moveVelocity;}void Aniamting(){animator.SetFloat("Blend",rd.velocity.magnitude);//調用animator.SetFloat方法,可以設置混合樹中的參數數值,參數名字以自定義的參數名為準
    }
}

?【3】scriptableobject(Unity中用于處理序列化的結構)

一個允許你存儲大量獨立于腳本實例的共享數據的類。

目的是通過避免對值進行復制而減少內存的開銷。

定義了一個繼承自ScriptableObject的類,你可以使用CreateAssetMenu?attribute用你的類創建自定義assets。

下面為實例:

Player加載的類

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class CharacterStats : MonoBehaviour
{//Stats:一個統計玩家數據的類#region MyRegion//#region 是 C# 預處理器指令。 #region 是一個分塊預處理命令,它主要是用于編輯器代碼的分塊,在編譯時會被自動刪除。//#region 在使用 Visual Studio 代碼編輯器的大綱顯示功能時指定可展開或折疊的代碼塊。有助于代碼的整潔。//
    public static CharacterStats instance;void Awake(){instance = this;//傳遞自身的地址}#endregionpublic int MaxHealth = 100;public int CurrentHealth { get; private set; }//可以公共獲取,但只能在該類中設置。void Start(){CurrentHealth = MaxHealth;}public void takeDamage(int damage){CurrentHealth -= damage;if (CurrentHealth <= 0){Dead();}}public void TreatHealth(int treat){print("treat:"+treat);CurrentHealth += treat;print(CurrentHealth);if (CurrentHealth >= 100){print("你恢復了健康");}}public void Dead(){print("You Dead");}}

互動對象體加載的類:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ItemPickUp : Interacrable
{//繼承自Interacrable類(含有與環境互動的代碼)public Itemss item;CharacterStats charStatss=new CharacterStats();public override void Interact()//重寫了父類的方法,并搭載的自己的內容{base.Interact();PickUp();}void PickUp(){item.Use();//這里使用的派生類的基類,但實際上傳遞的是根據Item基類自定義的assets。
        Destroy(gameObject);}
}

以下是相關的類,并未直接加載到對象上:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;[CreateAssetMenu(fileName = " NewItems",menuName = "Inventory/Item")]public class Itemss : ScriptableObject
{//創建assets的基類new public string name = "Item";public Sprite icon = null;public virtual void Use(){}
}

?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[CreateAssetMenu(fileName = "New Health Potion",menuName = "Inventory/Item/Health Potion")]
public class HealthPotion : Itemss
{//繼承自Item類的子類,是assets新的藍本。public int HealthModifity;private CharacterStats charStats;void Start(){charStats=CharacterStats.instance;}public override void Use(){base.Use();ApplyEffect();}void ApplyEffect(){CharacterStats.instance.TreatHealth(HealthModifity);//傳遞了玩家參數類的方法。
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Interacrable : MonoBehaviour
{//包含玩家與環境互動的類public bool interacting = false;private Renderer rend;public Material[] materials;void Start(){rend = GetComponent<Renderer>();rend.enabled=true;//啟用渲染器,使渲染的對象可見rend.sharedMaterial = materials[0];//Renderer.sharedMaterial:修改模型材質的顏色,或者是修改材質Shader的一些屬性。//(此方法使用的材料是共享的材料,內存中只有一份,不建議對材料做修改)
    }void Update(){if (interacting&&Input.GetKeyDown(KeyCode.Alpha1)){Interact();}if (interacting){rend.sharedMaterial = materials[1];}else{rend.sharedMaterial = materials[0];}}public virtual  void Interact(){//虛方法,子類可加Override進行重寫,虛方法本身有方法體。
        Destroy(gameObject);}void OnTriggerEnter(Collider other){if (other.gameObject.tag == "Player"){interacting = true;}}void OnTriggerExit(Collider other){if (other.gameObject.tag == "Player"){interacting = false;}}
}

?

posted on 2019-07-03 20:27 青先生 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/Mr-QingZi/p/11128829.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/247647.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/247647.shtml
英文地址,請注明出處:http://en.pswp.cn/news/247647.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue axios POST請求中參數以form data和request payload形式的原因

HTTP請求中&#xff0c;如果是get請求&#xff0c;那么表單參數以namevalue&name1value1的形式附到url的后面&#xff0c;如果是post請求&#xff0c;那么表單參數是在請求體中&#xff0c;也是以namevalue&name1value1的形式在請求體中。通過chrome的開發者工具可以看…

vue-resource使用

vue-resource是一個http請求插件&#xff0c;遵循promise&#xff0c;類似jquery中ajax操作。 vue-resource已不被官方推薦&#xff0c;官方推薦axios插件來操作http協議。 vue-resource中提供的方法 get(url, [options]) head(url, [options]) delete(url, [options]) jso…

HttpHttps

http協議與https Http 客戶端發送一個HTTP請求到服務器的請求消息包括以下格式&#xff1a; **請求行&#xff08;request line&#xff09;、請求頭部&#xff08;header&#xff09;、空行 和請求數據四個部分組成。** Get請求例子&#xff0c;使用Charles抓取的request&…

vue2使用axios post跳坑,封裝成模塊

終于將vue-resource替換成axios了&#xff0c;其中像application/x-www-form-urlencoded發送的頭信息以及返回的response結果這兩點都需要注意一下。 其實https://github.com/mzabriskie/axios也有說明的。因為我在vue-resource中使用了Vue.http.options.emulateJSON true;&am…

axios使用

axios和vue-resource一樣&#xff0c;是一個vue中操作http的插件&#xff0c;遵循promise&#xff0c;vue官方也推薦使用axios。 安裝axios npm i axios -S axios也是在運行時需要的&#xff0c;所以要保存在dependencies中。 引入axios import axios from axios Vue.proto…

jQuery length 和 size()區別

jQuery length和size()區別總結如下&#xff1a; 1.length是屬性&#xff0c;size()是方法。 2.如果你只是想獲取元素的個數&#xff0c;兩者效果一樣既 $("img").length 和 $("img").size() 獲取的值是一樣的&#xff1b;但是如果是獲取字符串的長…

一些關于自己的未來的東西

2019.7.4 自己大一建立對編程的基礎認識&#xff0c;確實培養了一些興趣&#xff0c;入了個門&#xff0c;不過沒有接觸到本質。大二加入到了學校的網站開發團隊&#xff0c;對網站開發后端進行了學習&#xff0c;對后臺開發也有了基礎的學習吧&#xff0c;哈哈可能以后就是要走…

Javascript面向對象編程:構造函數的繼承

今天要介紹的是&#xff0c;對象之間的"繼承"的五種方法。 比如&#xff0c;現在有一個"動物"對象的構造函數。 function Animal(){ this.species "動物"; } 還有一個"貓"對象的構造函數。 function Cat(name,color){ this.name nam…

并發與多線程

并發 并發&#xff08;concurrency&#xff09;是指CPU在某個時間段內交替處理多任務的能力。每個CPU不可能只顧著執行某個進程&#xff0c;而讓其他進程一直等待被執行。所以&#xff0c;CPU把可執行時間均分成若干份&#xff0c;每個進程執行一份或多份時間后&#xff0c;記錄…

有沒有朋友可以幫我解釋一下貼水是什么意思?

通俗易懂的講&#xff1a;貼水便宜&#xff0c;升水貴 當前&#xff0c;螺紋鋼05合約就是貼水01合約 翻譯&#xff0c;螺紋鋼05合約就是比01合約便宜 升水同理 轉載于:https://www.cnblogs.com/luoluo-123/p/11142229.html

es6常用點記錄

letconst解構賦值字符串數組函數對象SymbolSetWeakSetMapWeakMapProxyreflectProxy與Reflex結合實例classpromiseiteratorGerneratorDecorators模塊學習資料 let /* let 聲明變量 *//* es6相對于es5的全局和局部作用域&#xff0c;多了一個塊作用域&#xff0c;塊作用域里聲明的…

jquery插件封裝指南

入門 編寫一個jQuery插件開始于給jQuery.fn加入??新的功能屬性&#xff0c;此處添加的對象屬性的名稱就是你插件的名稱&#xff1a; jQuery.fn.myPlugin function(){//你自己的插件代碼};用戶非常喜歡的$符號哪里去了&#xff1f; 它仍然存在&#xff0c;但是&#xff0c;為…

synchronize原理

synchronized的三種應用方式 一. 修飾實例方法&#xff0c;作用于當前實例加鎖&#xff0c;進入同步代碼前要獲得當前實例的鎖。 二. 修飾靜態方法&#xff0c;作用于當前類對象加鎖&#xff0c;進入同步代碼前要獲得當前類對象的鎖。 三. 修飾代碼塊&#xff0c;指定加鎖對象&…

不能修改“System Roots”鑰匙串

iOS mac添加證書 不能修改“System Roots”鑰匙串錯誤 如圖&#xff1a; 解決方式&#xff1a; 打開鑰匙串---登錄---&#xff0c;直接把證書拖過來 然后&#xff0c;查看--我的證書&#xff0c;里面&#xff0c;找到證書&#xff0c;即可

stylus在vue中的使用

stylus是一個css預處理器&#xff0c;比較流行的css預處理器有sass、less、stylus&#xff0c;它們都一樣&#xff0c;都是css的語法糖&#xff0c;可以使用變量&#xff0c;可以有簡單的邏輯&#xff0c;使css的開發效率更高&#xff0c;更易維護。stylus來自node社區&#xf…

未來產品的設計

Donald A. Norman繼《情感化設計》之后&#xff0c;又一設計精品力作&#xff1a; 未來產品的設計樣章試讀及本書預定&#xff1a;http://www.china-pub.com/195642市場價 &#xff1a;&#xffe5;39.00 會員價 &#xff1a; &#xffe5;29.25(75折) 【作  者】(美)Donald…

vue-cli webpack 配置分析

目錄結構 . ├── README.md ├── build │ ├── build.js │ ├── check-versions.js │ ├── dev-client.js │ ├── dev-server.js │ ├── utils.js │ ├── webpack.base.conf.js │ ├── webpack.dev.conf.js │ └── webpack.prod.c…

css之字體圖標

SVG與字體圖標 SVG圖片是矢量圖片&#xff0c;不會隨著圖片的伸縮而影響質量&#xff0c;通常把只有一種顏色的圖標做成SVG&#xff0c;通過SVG生成字體圖標&#xff0c;放到項目中使用。 https://icomoon.io/是一個比較快捷的生成字體圖標的線上工具&#xff0c;進入主頁后&…

history.back(-1)和history.go(-1)的區別

history.back(-1):直接返回當前頁的上一頁&#xff0c;數據全部消息&#xff0c;是個新頁面 history.go(-1):也是返回當前頁的上一頁&#xff0c;不過表單里的數據全部還在 history.back(0) 刷新 history.back(1) 前進 history.back(-1) 后退

研發階段模擬接口數據

因為在vue-cli工程中需要創建很多.vue文件&#xff0c;我們希望創建vue文件和創建html、css、js文件一樣右鍵即可選擇創建&#xff0c;并且創建的文件中可預先寫好模板代碼。 webstorm-Preferences打開選項界面 選擇File and Code Templates&#xff0c;點擊綠色加號 填…