今天主要是学做roll a ball来进行unity的入门学习,了解它的一些简单操作。
首先是1工程的创建,2创建地面和游戏者a ball,注意创建GameObject后对Transform进行reset。3移动控制。代码如下:
public float speed; void FixedUpdate(){ float moveHorizontal = Input.GetAxis ("Horizontal"); float moveVertical = Input.GetAxis ("Vertical"); Vector3 moveMent = new Vector3 (moveHorizontal, 0.0f, moveVertical); GetComponent<Rigidbody> ().AddForce (moveMent * speed * Time.deltaTime); }
两点需要注意:一个是要写在FixeUpdate中,FixeUpdate是基于物理时间的调用,常用于控制运动。一个是注意将代码添加到a ball上后,要对speed进行赋值,这里我用的是500.
还有通过力来控制物体会显得更加真实。
4做围墙。5做摄影机的跟随。代码如下:
public GameObject player; private Vector3 Offset; // Use this for initialization void Start () { Offset = transform.position - player.transform.position; } // Update is called once per frame void Update () { } void LateUpdate(){ transform.position = player.transform.position + Offset; }
同样代码添加完后,要对player进行赋值。值为小球物体。
6食物的创建,使用预制体方便,注意要reset,再进行食物旋转的代码编写,代码如下:
void Start () {
}
void FixedUpdate(){
transform.Rotate (new Vector3 (15, 30, 45) * Time.deltaTime);
}
注意所有的食物属性的更改都只对预制体操作,还有运动需写在FixedUpdate中。7对预制体设置标签,用于计数。
8创建UI界面,在移动控制代码中添加计分功能,显示出来,还加了一个胜利的判断。
9运行调试,最后导出。
接下来是自己更改后的小球二代。
改进为小球为一定时间间隔内自动生成,且位置为随机的,玩法也有改进,必须按照小球的生成顺序吃,才能吃球,生成小球间隔时间为自己可调节的。附加代码有两部分,一部分是在角色控制中加的判断,另一部分是自己之前写的单链表,因为判断顺序吃球中有用到单链表。代码如下
主角控制代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using dataLianbiao; public class PlayerController : MonoBehaviour { // Use this for initialization public float speed; private int count; public Text countText; public int Max; // public GameObject Prefab; private float cubeX; private float cubeZ; public float jiange; private float t1; private float t2; TestList<GameObject>obj = new TestList<GameObject>(); void Start(){ t1 = 0.0f; t2 = 0.0f; count = 0; setCountText (); } void FixedUpdate(){ float moveHorizontal = Input.GetAxis ("Horizontal"); float moveVertical = Input.GetAxis ("Vertical"); Vector3 moveMent = new Vector3 (moveHorizontal, 0.0f, moveVertical); GetComponent<Rigidbody> ().AddForce (moveMent * speed * Time.deltaTime); } // Update is called once per frame void Update () { Produce (); } void OnTriggerEnter(Collider other){ if (other.gameObject.tag == "PickUp"&&obj.GetIndex(other.gameObject)==count+1) { other.gameObject.SetActive (false); count++; setCountText (); } } void setCountText(){ if (count < Max) { countText.text = "Count:" + count; } else { countText.text = "You Win!"; } } void Produce(){ if (t2-t1 < jiange) { t2 += Time.deltaTime; } else { t1 = t1 + jiange; t2 += Time.deltaTime; GameObject cube = (GameObject)Instantiate (Prefab); obj.Add (cube); cubeX = Random.Range (-10.0f, 10.0f); cubeZ = Random.Range (-10.0f, 10.0f); Vector3 weizhi = new Vector3 (cubeX, 0.5f, cubeZ); cube.transform.position = weizhi; } } }
单链表代码:
using System.Collections; using System.Collections.Generic; using UnityEngine; namespace dataLianbiao{ public interface LianbiaoList<T>{ void Add (T item); int Count{ get;} void Clear (); void Insert (int index, T item); void RemoveAt (int index); T GetValue (int indexer); int GetIndex (T item); bool IsEmpty (); } class Node<T>{ public T Value; public Node<T>NextNode; public Node(T value){ Value = value; NextNode = null; } public Node(){ Value = default(T); } } class TestList<T>:LianbiaoList<T>{ private Node<T>head = null; private int _count = 0; private int maxSize =100; public bool IsEmpty(){ return _count > maxSize; } public void Add(T item){ if (head == null) { head = new Node<T> (item); _count++; } else { Node<T> node = head; while (node.NextNode != null) { node = node.NextNode; } _count++; node.NextNode = new Node<T> (item); } } public int Count{get{ return _count;}} public void Clear(){ head = null; _count = 0; } public void Insert(int index,T item){ if (index >= 0 && index < _count) { Node<T> node = head; Node<T> prev = null; Node<T> next = null; if (index == 0) { next = head; head = new Node<T> (item); head.NextNode = next; } else { for (int i = 0; i < index; i++) { prev = node; node = node.NextNode; } next = node; node = new Node<T> (item); node.NextNode = next; prev.NextNode = node; } _count++; } /*else { throw new UnityException ("Out of Range!"); }*/ } public void RemoveAt(int index){ if (index >= 0 && index < _count) { Node<T> node = head; Node<T> prev = null; if (index == 0) { head = head.NextNode; } else { for (int i = 0; i < index; i++) { prev = node; node = node.NextNode; } prev.NextNode = node.NextNode; } _count--; } } public IEnumerator<T> GetEnumerator(){ Node<T> node = head; Node<T> result = new Node<T> (); while (node != null) { result = node; node = node.NextNode; yield return result.Value; } } public T GetValue(int index){ if (index >= 0 && index < _count) { Node<T> node = head; for (int i = 1; i < index; i++) { node = node.NextNode; } return node.Value; } return default(T); } public int GetIndex(T item){ Node<T> node = head; int i = 1; while (!node.Value.Equals (item) && node.NextNode != null) { node = node.NextNode; i++; } if (i == _count) { return -1; } else { return i; } } } }
后面开始尝试UI的学习。