unity开发经验(不定期更新)

希望我的开发日志记录的经验越来越多,给以后得自己留个记录和参考,同时也能为广大的同样是想做unity独立开发者的朋友一些经验和参考,互相学习,互相进步!如果想合作的可以加我微信:wqm994,一起探讨unity引擎,在独立开发的道路上齐头并进!!

废话不多说,开始正题:

如何实现点击按钮弹出菜单栏?

实现方法:

再建一个Canvas,在这个Canvas上加入所有你想加的东西

然后加代码:

public Canvas canvas;

void Start()

{

canvas.enabled=false;

}

public void Click()

{

canvas.enabled=true;

}

将这个代码加到任意游戏物体上,然后就和普通的创建按钮点击事件操作一样了。

注意:回到unity后把Canvas关联上。

unity5.6版本的video组件,在通过代码控制它的时候,必须引用命名空间,即必须进行程序集引用:

using UnityEngine .Video ;(这是必须的)

控制视频的播放与暂停

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

using UnityEngine .Video ;

public class bofang : MonoBehaviour {

public VideoPlayer vp;

// Use this for initialization

void Start () {

vp.Stop ();

}

// Update is called once per frame

void OnMouseDown () {

vp.Play ();

}

}

如何实例化发射炮弹?(变种:如何发射类似于英雄联盟中极地大乱斗中的雪球?)

public Rigidbody paodan;

public float speed=20f;

void Update()

{

if(Input.GetButtonDown(KeyCode.F)){

Rigidbody newpandan=Instantiate(pandan,transform.position,transform.rotation) as Rigidbody;

newpandan.velocity=transform.TransformDirection(new Vector3(0,0,speed));

}

}

如何每隔一段时间克隆一个呢?

public GameObject monster;//要克隆的游戏物体(必须要制作成预制)

public float jdtime = 5.0f;//每隔5秒克隆一个

private float nextgs = 0.0f;//游戏时长

void Start () {

}

void Update () {

if(Time .time >nextgs )//判断实际游戏时长是否大于游戏时长

{

nextgs = Time.time + jdtime;

GameObject newgs=Instantiate(monster,transform.position,transform.rotation) as GameObject ;

}

}

}

改变鼠标样式:

public Textrue2D mousetextrue;

void OnMouseOver()

{

Cursor.SetCursor(mousetextrue,Vector2.zero,CursorMode.Auto);

}

void OnMouseExit()

{

Cursor.SetCursor(null,Vector2.zero,CursorMode.Auto);

}

在脚本组件小齿轮图标下自定义菜单项:

[ContextMenu("XXXX")] //XXXX为菜单名字

void XXXX(){

}

如何制作光线投射,即发射射线来检测是否碰撞到物体?

void Update(){

RaycastHit hit;设置一个RaycastHit类型的变量。

if (Physics.Raycast(transform.position,transform.forword,hit,3)){//transform.position表示从此脚本所依附的游戏物体的位置发射射线;transform.forword表示射线的朝向和所依附的游戏物体一致

这里面即可写一些做什么事的代码

}

}

在当前物体的位置绘制图像等元素的函数:

void OnDrawGizmos()

{

XXXXXX

}

如何建立路点?在场景中摆好各个路点,并把“parent”和“Next”设置好。然后为每个路点(空物体)添加以下脚本:

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class PathNode : MonoBehaviour {

public PathNode m_parent;//路点

public PathNode m_next;

public void SetNext(PathNode node){

if (m_next != null) {

m_next.m_parent = null;

}

m_next = node;

node.m_parent = this;

}

void OnDrawGizmos(){

Gizmos .DrawIcon (this .transform .position ,"timg.jpg");

}

}

如何让人物或者你需要的游戏物体沿着你架设的路点移动?

using System.Collections;

using System.Collections.Generic;

using UnityEngine;

public class Enemy : MonoBehaviour {

public PathNode m_currentNode;

public float E_life = 15.0f;

public float max_life = 15.0f;

public float speed = 12.0f;

//public Enemy inst;

//void Start () {

//inst = this;

//}

void Update () {

RotateTo ();

MoveTo ();

}

public void RotateTo()

{

float current = transform.eulerAngles.y;

this.transform.LookAt (m_currentNode.transform);

Vector3 target = this.transform.eulerAngles;

float next = Mathf.MoveTowardsAngle (current, target.y, 120 * Time.deltaTime);

this.transform.eulerAngles = new Vector3 (0, next, 0);

}

public void MoveTo()

{

Vector3 pos1 = transform.position;

Vector3 pos2 = m_currentNode.transform.position;

float dist = Vector2.Distance (new Vector2 (pos1.x, pos1.z), new Vector2 (pos2.x, pos2.z));

if (dist < 1.0f) {

if (m_currentNode.m_next == null) {

Destroy (this.gameObject);

}else {m_currentNode = m_currentNode.m_next;}

}

transform.Translate (new Vector3 (0, 0 ,speed * Time.deltaTime));

}

}

如果好几个物体都需要用同一个代码,则可以使用下面的技巧(如,控制玩家的代码,但由于分敌我情况,但脚本都是一样的)

那么则可以这样做:

[Range(1, 2)]

这里则申请一个int型的变量,如

public int playernum=1;//初始时是玩家1

这样则可以在检视面板出现一个滑块,滑块的数字的多少由上面的中括号里的数字来定。

(注:[Range(1, 2)]只能用来控制它下面的一个变量,所以我们要把需要控制的变量写到下面,并且保证变量类型和上面的一致)

接着就可以在代码里面这样来做:

if(playernum==1)

{

//任何你想做的事

}

if(playernum==2)

{

//任何你想做的事

}

....

如何在安卓设备中播放视频:

using UnityEngine;

using System.Collections;

public class Test : MonoBehaviour {

//以下都为全屏播放

//必须将视频转换成MP4格式并且放到Assets/StreamingAssets文件夹下

public GUIStyle buttontype;

public Texture buttonzhanshi;

void OnGUI()

{

//if (GUI.Button(new Rect(40, 600, 68, 76), "播放"))//触屏后会取消播放

//{

// Handheld.PlayFullScreenMovie("GS.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput);

//}

//if (GUI.Button(new Rect(20, 290, 200, 200), "全屏播放"))

//{

// Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Full);

//}

//if (GUI.Button(new Rect(20, 500, 200, 200), "隐藏按钮控制器"))//隐藏控制器

//{

// Handheld.PlayFullScreenMovie("test.mp4", Color.black, FullScreenMovieControlMode.Hidden);

//}

if (GUI.Button(new Rect(30, 600, 100, 150), buttonzhanshi,buttontype ))

{

Handheld.PlayFullScreenMovie("GS.mp4", Color.black, FullScreenMovieControlMode.Minimal);

}

}

}

将脚本直接放到摄像机上即可。


怎么在Unity中实现划线效果呢?即通过鼠标来划线。代码如下:

public class DrawLineTest : MonoBehaviour {

private GameObject clone;

private LineRenderer line;

private int i;

public GameObject tf;

void Start () {

}

// Update is called once per frame

void Update () {

if (Input.GetMouseButtonDown(0))

{

clone = (GameObject)Instantiate(tf, tf.transform.position, transform.rotation);//克隆一个带有LineRender的物体

//clone.gameObject.GetComponent().enabled=false;

//clone.GetComponent().enabled=true;

line = clone.GetComponent();//获得该物体上的LineRender组件

line.SetColors(Color.blue, Color.red);//设置颜色

line.SetWidth(0.2f, 0.1f);//设置宽度

i = 0;

}

if (Input.GetMouseButton(0))

{

i++;

line.SetVertexCount(i);//设置顶点数

line.SetPosition(i - 1, Camera.main.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 15)));//设置顶点位置

}

if (Input.GetMouseButtonUp (0)) {

line.enabled=false;

Destroy (clone, 1);

}

}

}

将此脚本挂载到摄像机上?并在工程面板里将tf游戏物体关联上,运行,就可以划线了!

未完待续.....

 

 

 

 

 

你可能感兴趣的:(unity开发经验(不定期更新))