-
Notifications
You must be signed in to change notification settings - Fork 11
/
Part 4.html
732 lines (539 loc) · 69 KB
/
Part 4.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
<!DOCTYPE html>
<!-- saved from url=(0112)https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4 -->
<html lang="en"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><script async="" src="./Part 4_files/analytics.js.descarga"></script><script src="./Part 4_files/analytics.js(1).descarga" type="text/javascript"></script>
<script type="text/javascript">window.addEventListener('DOMContentLoaded',function(){var v=archive_analytics.values;v.service='wb';v.server_name='wwwb-app104.us.archive.org';v.server_ms=633;archive_analytics.send_pageview({});});</script>
<script type="text/javascript" src="./Part 4_files/ait-client-rewrite.js.descarga" charset="utf-8"></script>
<script type="text/javascript">
WB_wombat_Init('https://web.archive.org/web', '20150311034426', 'alexstv.com:80');
</script>
<script type="text/javascript" src="./Part 4_files/wbhack.js.descarga" charset="utf-8"></script>
<script type="text/javascript">
__wbhack.init('https://web.archive.org/web');
</script>
<link rel="stylesheet" type="text/css" href="./Part 4_files/banner-styles.css">
<link rel="stylesheet" type="text/css" href="./Part 4_files/iconochive.css">
<!-- End Wayback Rewrite JS Include -->
<title>AlexStv</title>
<meta name="description" content="Code and things">
<link rel="stylesheet" href="./Part 4_files/reset.css">
<link rel="stylesheet" href="./Part 4_files/style.css">
<link rel="alternate" type="application/rss+xml" title="RSS" href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/feeds/rss">
<link rel="shortcut icon" href="https://web.archive.org/web/20150311034426im_/http://alexstv.com:80/themes/AnchoredGallery/img/favicon.png">
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<script>var base = '/themes/AnchoredGallery/';</script>
<script src="./Part 4_files/zepto.js.descarga"></script>
<script src="./Part 4_files/main.js.descarga"></script>
<link href="./Part 4_files/css" rel="stylesheet" type="text/css">
<link href="./Part 4_files/css(1)" rel="stylesheet" type="text/css">
<link type="text/css" rel="Stylesheet" href="./Part 4_files/shCoreRDark.css">
<meta name="viewport" content="width=600">
<meta name="generator" content="Anchor CMS">
<meta property="og:title" content="AlexStv">
<meta property="og:type" content="website">
<meta property="og:url" content="posts/unity-voxel-block-tutorial-pt-4">
<meta property="og:image" content="/web/20150311034426im_/http://alexstv.com:80/themes/AnchoredGallery/img/og_image.gif">
<meta property="og:site_name" content="AlexStv">
<meta property="og:description" content="Code and things">
<!-- Include required JS files -->
<script type="text/javascript" src="./Part 4_files/shCore.js.descarga"></script>
<script type="text/javascript" src="./Part 4_files/shBrushCSharp.js.descarga"></script>
<script type="text/javascript" src="./Part 4_files/jquery.min.js.descarga"></script>
<!-- Include jQuery Syntax Highlighter -->
<script type="text/javascript" src="./Part 4_files/jquery.syntaxhighlighter.min.js.descarga"></script>
<!-- Initialise jQuery Syntax Highlighter -->
<script type="text/javascript">$.SyntaxHighlighter.init();</script>
<!-- Initialise jQuery Syntax Highlighter -->
<script type="text/javascript">
$.SyntaxHighlighter.init({
'alternateLines':true
});
</script>
<script type="text/javascript">
SyntaxHighlighter.all()
</script><script type="text/javascript" src="./Part 4_files/prettify.min.js.descarga" id="script-httpswebarchiveorgweb20150323181528httpbaluptongithubcomjquerysyntaxhighlighterprettifyprettifyminjs"></script><link type="text/css" rel="stylesheet" media="screen" href="./Part 4_files/prettify.min.css" id="stylesheet-httpswebarchiveorgweb20150323181528httpbaluptongithubcomjquerysyntaxhighlighterprettifyprettifymincss"><link type="text/css" rel="stylesheet" media="screen" href="./Part 4_files/style.min.css" id="stylesheet-httpswebarchiveorgweb20150323181528httpbaluptongithubcomjquerysyntaxhighlighterstylesstylemincss"><link type="text/css" rel="stylesheet" media="screen" href="./Part 4_files/theme-balupton.min.css" id="stylesheet-httpswebarchiveorgweb20150323181528httpbaluptongithubcomjquerysyntaxhighlighterstylesthemebaluptonmincss"></head>
<body class="posts home"><div id="wm-ipp" lang="en" style="display: block; direction: ltr;">
<div style="position:fixed;left:0;top:0;right:0;">
<div id="wm-ipp-inside">
<div style="position:relative;">
<div id="wm-logo" style="float:left;width:130px;padding-top:10px;">
<a href="https://web.archive.org/web/" title="Wayback Machine home page"><img src="./Part 4_files/wayback-toolbar-logo.png" alt="Wayback Machine" width="110" height="39" border="0"></a>
</div>
<div class="r" style="float:right;">
<div id="wm-btns" style="text-align:right;height:25px;">
<div id="wm-save-snapshot-success">success</div>
<div id="wm-save-snapshot-fail">fail</div>
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4#" onclick="__wm.saveSnapshot('http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4', '20150311034426')" title="Share via My Web Archive" id="wm-save-snapshot-open" style="display: none;">
<span class="iconochive-web"></span>
</a>
<a href="https://archive.org/account/login.php" title="Sign In" id="wm-sign-in" style="display: inline-block;">
<span class="iconochive-person"></span>
</a>
<span id="wm-save-snapshot-in-progress" class="iconochive-web" style="display: none;"></span>
<a href="http://faq.web.archive.org/" title="Get some help using the Wayback Machine" style="top:-6px;"><span class="iconochive-question" style="color:rgb(87,186,244);font-size:160%;"></span></a>
<a id="wm-tb-close" href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4#close" onclick="__wm.h(event);return false;" style="top:-2px;" title="Close the toolbar"><span class="iconochive-remove-circle" style="color:#888888;font-size:240%;"></span></a>
</div>
<div id="wm-share" style="text-align:right;">
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4#" onclick="window.open('https://www.facebook.com/sharer/sharer.php?u=https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4', '', 'height=400,width=600'); return false;" title="Share on Facebook" style="margin-right:5px;" target="_blank"><span class="iconochive-facebook" style="color:#3b5998;font-size:160%;"></span></a>
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4#" onclick="window.open('https://twitter.com/intent/tweet?text=https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4&via=internetarchive', '', 'height=400,width=600'); return false;" title="Share on Twitter" style="margin-right:5px;" target="_blank"><span class="iconochive-twitter" style="color:#1dcaff;font-size:160%;"></span></a>
</div>
</div>
<table class="c" style="">
<tbody>
<tr>
<td class="u" colspan="2">
<form target="_top" method="get" action="https://web.archive.org/web/submit" name="wmtb" id="wmtb"><input type="text" name="url" id="wmtbURL" value="http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" onfocus="this.focus();this.select();" autocomplete="off"><input type="hidden" name="type" value="replay"><input type="hidden" name="date" value="20150311034426"><input type="submit" value="Go"></form>
</td>
<td class="n" rowspan="2" style="width:110px;">
<table>
<tbody>
<!-- NEXT/PREV MONTH NAV AND MONTH INDICATOR -->
<tr class="m">
<td class="b" nowrap="nowrap"><a href="https://web.archive.org/web/20150201044932/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" title="01 Feb 2015"><strong>Feb</strong></a></td>
<td class="c" id="displayMonthEl" title="You are here: 03:44:26 Mar 11, 2015">MAR</td>
<td class="f" nowrap="nowrap"><a href="https://web.archive.org/web/20150511004007/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" title="11 May 2015"><strong>May</strong></a></td>
</tr>
<!-- NEXT/PREV CAPTURE NAV AND DAY OF MONTH INDICATOR -->
<tr class="d">
<td class="b" nowrap="nowrap"><a href="https://web.archive.org/web/20150201044932/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" title="04:49:32 Feb 01, 2015"><img src="./Part 4_files/wm_tb_prv_on.png" alt="Previous capture" width="14" height="16" border="0"></a></td>
<td class="c" id="displayDayEl" style="width:34px;font-size:24px;white-space:nowrap;" title="You are here: 03:44:26 Mar 11, 2015">11</td>
<td class="f" nowrap="nowrap"><a href="https://web.archive.org/web/20150511004007/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" title="00:40:07 May 11, 2015"><img src="./Part 4_files/wm_tb_nxt_on.png" alt="Next capture" width="14" height="16" border="0"></a></td>
</tr>
<!-- NEXT/PREV YEAR NAV AND YEAR INDICATOR -->
<tr class="y">
<td class="b" nowrap="nowrap">2014</td>
<td class="c" id="displayYearEl" title="You are here: 03:44:26 Mar 11, 2015">2015</td>
<td class="f" nowrap="nowrap"><a href="https://web.archive.org/web/20160322113037/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" title="22 Mar 2016"><strong>2016</strong></a></td>
</tr>
</tbody>
</table>
</td>
</tr>
<tr>
<td class="s">
<div id="wm-nav-captures"><a class="t" href="https://web.archive.org/web/*/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" title="See a list of every capture for this URL">28 captures</a><div class="r" title="Timespan for captures of this URL">31 Jan 2015 - 16 Oct 2017</div></div>
</td>
<td class="k">
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4" id="wm-graph-anchor">
<div id="wm-ipp-sparkline" title="Explore captures for this URL" style="position: relative">
<canvas id="wm-sparkline-canvas" width="575" height="27" border="0"></canvas>
<div class="yt" style="display: none; width: 25px; height: 27px;"></div><div class="mt" style="display: none; width: 2px; height: 27px;"></div></div>
</a>
</td>
</tr>
</tbody>
</table>
<div style="position:absolute;bottom:0;right:2px;text-align:right;">
<a id="wm-expand" class="wm-btn wm-closed" href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4#expand" onclick="__wm.ex(event);return false;"><span id="wm-expand-icon" class="iconochive-down-solid"></span> <span style="font-size:80%">About this capture</span></a>
</div>
</div>
<div id="wm-capinfo" style="border-top:1px solid #777;display:none; overflow: hidden">
<div style="background-color:#666;color:#fff;font-weight:bold;text-align:center">COLLECTED BY</div>
<div style="padding:3px;position:relative" id="wm-collected-by-content">
<div style="display:inline-block;vertical-align:top;width:50%;">
<span class="c-logo" style="background-image:url(https://archive.org/services/img/alexacrawls);"></span>
Organization: <a style="color:#33f;" href="https://archive.org/details/alexacrawls" target="_new"><span class="wm-title">Alexa Crawls</span></a>
<div style="max-height:75px;overflow:hidden;position:relative;">
<div style="position:absolute;top:0;left:0;width:100%;height:75px;background:linear-gradient(to bottom,rgba(255,255,255,0) 0%,rgba(255,255,255,0) 90%,rgba(255,255,255,255) 100%);"></div>
Starting in 1996, <a href="http://www.alexa.com/">Alexa Internet</a> has been donating their crawl data to the Internet Archive. Flowing in every day, these data are added to the <a href="http://web.archive.org/">Wayback Machine</a> after an embargo period.
</div>
</div>
<div style="display:inline-block;vertical-align:top;width:49%;">
<span class="c-logo" style="background-image:url(https://archive.org/services/img/alexacrawls)"></span>
<div>Collection: <a style="color:#33f;" href="https://archive.org/details/alexacrawls" target="_new"><span class="wm-title">Alexa Crawls</span></a></div>
<div style="max-height:75px;overflow:hidden;position:relative;">
<div style="position:absolute;top:0;left:0;width:100%;height:75px;background:linear-gradient(to bottom,rgba(255,255,255,0) 0%,rgba(255,255,255,0) 90%,rgba(255,255,255,255) 100%);"></div>
Starting in 1996, <a href="http://www.alexa.com/">Alexa Internet</a> has been donating their crawl data to the Internet Archive. Flowing in every day, these data are added to the <a href="http://web.archive.org/">Wayback Machine</a> after an embargo period.
</div>
</div>
</div>
<div style="background-color:#666;color:#fff;font-weight:bold;text-align:center" title="Timestamps for the elements of this page">TIMESTAMPS</div>
<div>
<div id="wm-capresources" style="margin:0 5px 5px 5px;max-height:250px;overflow-y:scroll !important"></div>
<div id="wm-capresources-loading" style="text-align:left;margin:0 20px 5px 5px;display:none"><img src="./Part 4_files/loading.gif" alt="loading"></div>
</div>
</div></div></div></div><!-- BEGIN WAYBACK TOOLBAR INSERT -->
<script type="text/javascript" src="./Part 4_files/timestamp.js.descarga" charset="utf-8"></script>
<script type="text/javascript" src="./Part 4_files/graph-calc.js.descarga" charset="utf-8"></script>
<script type="text/javascript" src="./Part 4_files/auto-complete.js.descarga" charset="utf-8"></script>
<script type="text/javascript" src="./Part 4_files/toolbar.js.descarga" charset="utf-8"></script>
<style type="text/css">
body {
margin-top:0 !important;
padding-top:0 !important;
/*min-width:800px !important;*/
}
.wb-autocomplete-suggestions {
text-align: left; cursor: default; border: 1px solid #ccc; border-top: 0; background: #fff; box-shadow: -1px 1px 3px rgba(0,0,0,.1);
position: absolute; display: none; z-index: 2147483647; max-height: 254px; overflow: hidden; overflow-y: auto; box-sizing: border-box;
}
.wb-autocomplete-suggestion { position: relative; padding: 0 .6em; line-height: 23px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; font-size: 1.02em; color: #333; }
.wb-autocomplete-suggestion b { font-weight: bold; }
.wb-autocomplete-suggestion.selected { background: #f0f0f0; }
</style>
<script type="text/javascript">
__wm.bt(575,27,25,2,"web","http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4","2015-03-11",1996);
</script><div class="wb-autocomplete-suggestions "></div>
<!-- END WAYBACK TOOLBAR INSERT -->
<div style="background-color:#4774A5; overflow:hidden; background-position:center; background-image:url('https://web.archive.org/web/20150311034426im_/http://4.bp.blogspot.com/-9w7pH08mSaM/UGbaDEz3kOI/AAAAAAAADeI/9XWFFsdLdwg/s1600/body.png');background-repeat:repeat;">
<article class="wrapper">
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/">
<header>
<titletext>AlexStv</titletext>
</header>
</a>
<div class="pagewrapper" style="width:100%">
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/category/general" title="General">
<div class="page" style="width:33.333333333333%">
<stamptext>General (2)</stamptext>
</div>
</a>
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/category/voxels" title="Voxels">
<div class="page" style="width:33.333333333333%">
<stamptext>Voxels (7)</stamptext>
</div>
</a>
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/category/grapple" title="Grapple">
<div class="page" style="width:33.333333333333%">
<stamptext>Grapple (3)</stamptext>
</div>
</a>
</div>
</article>
</div>
<div class="bg2">
<article class="wrapper">
<div class="post">
<div id="filler">
<div class="description" style="width:100%; padding-bottom:30px; background-color:#3C5C89;">
<h1 style="color:#fff;">Unity voxel block tutorial pt. 4</h1>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
<p>In this part we're going to look at real time modification of the terrain by a player. This will usually be done by raycasting at the terrain to get a block position, then setting that block to another type or setting the empty space in front of it to another block. In this part we'll set up two classes, one with generic functions you can access from anywhere and another class as an example implementation of block modification.</p>
<p>Well start with a static class for the generic functions, <strong>create a new script and call it Terrain</strong> and set it up like this:
</p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_392037" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp keyword">using</code> <code class="csharp plain">UnityEngine;</code></div><div class="line number2 index1 alt1"><code class="csharp keyword">using</code> <code class="csharp plain">System.Collections;</code></div><div class="line number3 index2 alt2"> </div><div class="line number4 index3 alt1"><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp keyword">class</code> <code class="csharp plain">Terrain</code></div><div class="line number5 index4 alt2"><code class="csharp plain">{</code></div><div class="line number6 index5 alt1"> </div><div class="line number7 index6 alt2"><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>We won't be inheriting from MonoBehaviour and this class is static because it's just going to be a helper class. Next add our first function: GetBlockPos to round vector3 positions to their nearest block position.</p>
<p> </p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_810945" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp plain">WorldPos GetBlockPos(Vector3 pos)</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp plain">WorldPos blockPos = </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(</code></div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code><code class="csharp plain">Mathf.RoundToInt(pos.x),</code></div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Mathf.RoundToInt(pos.y),</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code><code class="csharp plain">Mathf.RoundToInt(pos.z)</code></div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">);</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code> </div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp plain">blockPos;</code></div><div class="line number10 index9 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>All we're doing is creating a WorldPos variable from the rounded components of the vector3 but it will be handy to have this function available anywhere.</p>
<p>Next let's get a position from a raycast collision with these two new functions:</p>
<p> </p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_103499" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp plain">WorldPos GetBlockPos(RaycastHit hit, </code><code class="csharp keyword">bool</code> <code class="csharp plain">adjacent = </code><code class="csharp keyword">false</code><code class="csharp plain">)</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Vector3 pos = </code><code class="csharp keyword">new</code> <code class="csharp plain">Vector3(</code></div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code><code class="csharp plain">MoveWithinBlock(hit.point.x, hit.normal.x, adjacent),</code></div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp plain">MoveWithinBlock(hit.point.y, hit.normal.y, adjacent),</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code><code class="csharp plain">MoveWithinBlock(hit.point.z, hit.normal.z, adjacent)</code></div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">);</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code> </div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp plain">GetBlockPos(pos);</code></div><div class="line number10 index9 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number11 index10 alt2"> </div><div class="line number12 index11 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">static</code> <code class="csharp keyword">float</code> <code class="csharp plain">MoveWithinBlock(</code><code class="csharp keyword">float</code> <code class="csharp plain">pos, </code><code class="csharp keyword">float</code> <code class="csharp plain">norm, </code><code class="csharp keyword">bool</code> <code class="csharp plain">adjacent = </code><code class="csharp keyword">false</code><code class="csharp plain">)</code></div><div class="line number13 index12 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number14 index13 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(pos - (</code><code class="csharp keyword">int</code><code class="csharp plain">)pos == 0.5f || pos - (</code><code class="csharp keyword">int</code><code class="csharp plain">)pos == -0.5f)</code></div><div class="line number15 index14 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number16 index15 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(adjacent)</code></div><div class="line number17 index16 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number18 index17 alt1"><code class="csharp spaces"> </code><code class="csharp plain">pos += (norm / 2);</code></div><div class="line number19 index18 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number20 index19 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">else</code></div><div class="line number21 index20 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number22 index21 alt1"><code class="csharp spaces"> </code><code class="csharp plain">pos -= (norm / 2);</code></div><div class="line number23 index22 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number24 index23 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number25 index24 alt2"><code class="csharp spaces"> </code> </div><div class="line number26 index25 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp plain">(</code><code class="csharp keyword">float</code><code class="csharp plain">)pos;</code></div><div class="line number27 index26 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>The first function is an overload of the last function we added, it has the same name but now takes a RaycastHit which you will get as the result of a raycast. It also optionally takes a boolean called adjacent which decides if you should get the block you hit or the block adjacent to the face you hit.</p>
<p></p><div class="infobox"><infoboxtext><p> <a href="https://web.archive.org/web/20150311034426/http://www.dotnetperls.com/overload">Overloading</a> and <a href="https://web.archive.org/web/20150311034426/http://www.dotnetperls.com/optional-parameters">optional parameters</a> are a good way to make your life easier as a developer. Instead of having a function for each input type with a different name you can create an overloaded version for each input type. Optional parameters are useful to give you the option of sending parameter to a function but otherwise use a default if the parameter is not included.</p></infoboxtext></div><p></p>
<p>In this function we create a new vector3 by calling MoveWithinBlock on each axis of the position. However, when we raycast onto a cube block the axis of the face the raycast hits will be 0.5, exactly half way between two blocks. To solve that we use MoveWithinBlock.</p>
<p>MoveWithinBlock gets called with x, y or z and the haycastHit's normal's x y or z. If the block is halfway between two blocks it will have a decimal of 0.5 so rounding it and subtracting the the rounded value from the original value which leaves us with the decimals. Then if we find that it's 0.5 we can use the normal to move it (if you're unfamiliar with normals they are vectors point in the way a triangle the facing, the normal included with the raycastHit is the normal of the triangle hit by the raycast). We can use the normal to move the point outwards or inwards, if we're getting the adjacent block add half the normal to the position pushing it outwards. Only add half because the whole thing could equal up to 1 which would push the position too far back. If we're not looking for the adjacent block subtract the same amount moving it further into the block we're pointing at.</p>
<p>Once we call MoveWithinBlock on every component of the position with the corresponding normal value we know that the position is within the block we want so we can call GetBlockPos with the vector3 and it will round it to a block position that we can return.</p>
<p>Now from anywhere in our code we can call Terrain.GetBlockPos(vector3) to round to a block position, Terrain.GetBlockPos(RaycastHit) to get the block hit by a raycast or Terrain.GetBlockPos(raycastHit, true) to get the block opposite the face hit by the raycast.</p>
<p>Now we'll add a globally accessible function to set blocks:
</p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_983937" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp keyword">bool</code> <code class="csharp plain">SetBlock(RaycastHit hit, Block block, </code><code class="csharp keyword">bool</code> <code class="csharp plain">adjacent = </code><code class="csharp keyword">false</code><code class="csharp plain">)</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Chunk chunk = hit.collider.GetComponent<Chunk>();</code></div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(chunk == </code><code class="csharp keyword">null</code><code class="csharp plain">)</code></div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp keyword">false</code><code class="csharp plain">;</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code> </div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">WorldPos pos = GetBlockPos(hit, adjacent);</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code> </div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp plain">chunk.world.SetBlock(pos.x, pos.y, pos.z, block);</code></div><div class="line number10 index9 alt1"><code class="csharp spaces"> </code> </div><div class="line number11 index10 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp keyword">true</code><code class="csharp plain">;</code></div><div class="line number12 index11 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>This function takes a raycastHit and gets the chunk hit. If there is no chunk component we have to return false because the collider is not a chunk. Otherwise we get the position of the block and call setBlock on the chunk's world component with the parameters supplied and return true. You'll be able to call this from anywhere and know if it was successful from the return value.</p>
<p>We'll add the same for getting blocks:</p>
<p> </p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_24035" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">public</code> <code class="csharp keyword">static</code> <code class="csharp plain">Block GetBlock(RaycastHit hit, </code><code class="csharp keyword">bool</code> <code class="csharp plain">adjacent = </code><code class="csharp keyword">false</code><code class="csharp plain">)</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Chunk chunk = hit.collider.GetComponent<Chunk>();</code></div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(chunk == </code><code class="csharp keyword">null</code><code class="csharp plain">)</code></div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp keyword">null</code><code class="csharp plain">;</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code> </div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">WorldPos pos = GetBlockPos(hit, adjacent);</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code> </div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Block block = chunk.world.GetBlock(pos.x, pos.y, pos.z);</code></div><div class="line number10 index9 alt1"><code class="csharp spaces"> </code> </div><div class="line number11 index10 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">return</code> <code class="csharp plain">block;</code></div><div class="line number12 index11 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>Same concept but here we return the block hit.</p>
<p>Now let's create an example script to use these functions. <strong>Create a new script called Modify</strong> and put this in it:
</p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_402137" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div><div class="line number19 index18 alt2">19</div><div class="line number20 index19 alt1">20</div><div class="line number21 index20 alt2">21</div><div class="line number22 index21 alt1">22</div><div class="line number23 index22 alt2">23</div><div class="line number24 index23 alt1">24</div><div class="line number25 index24 alt2">25</div><div class="line number26 index25 alt1">26</div><div class="line number27 index26 alt2">27</div><div class="line number28 index27 alt1">28</div><div class="line number29 index28 alt2">29</div><div class="line number30 index29 alt1">30</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">using</code> <code class="csharp plain">UnityEngine;</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">using</code> <code class="csharp plain">System.Collections;</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code> </div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">public</code> <code class="csharp keyword">class</code> <code class="csharp plain">Modify : MonoBehaviour</code></div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code> </div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Vector2 rot;</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code> </div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">void</code> <code class="csharp plain">Update()</code></div><div class="line number10 index9 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number11 index10 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(Input.GetKeyDown(KeyCode.Space))</code></div><div class="line number12 index11 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number13 index12 alt2"><code class="csharp spaces"> </code><code class="csharp plain">RaycastHit hit;</code></div><div class="line number14 index13 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(Physics.Raycast(transform.position, transform.forward,</code><code class="csharp keyword">out</code> <code class="csharp plain">hit, 100 ))</code></div><div class="line number15 index14 alt2"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number16 index15 alt1"><code class="csharp spaces"> </code><code class="csharp plain">Terrain.SetBlock(hit, </code><code class="csharp keyword">new</code> <code class="csharp plain">BlockAir());</code></div><div class="line number17 index16 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number18 index17 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number19 index18 alt2"><code class="csharp spaces"> </code> </div><div class="line number20 index19 alt1"><code class="csharp spaces"> </code><code class="csharp plain">rot= </code><code class="csharp keyword">new</code> <code class="csharp plain">Vector2(</code></div><div class="line number21 index20 alt2"><code class="csharp spaces"> </code><code class="csharp plain">rot.x + Input.GetAxis(</code><code class="csharp string">"Mouse X"</code><code class="csharp plain">) * 3,</code></div><div class="line number22 index21 alt1"><code class="csharp spaces"> </code><code class="csharp plain">rot.y + Input.GetAxis(</code><code class="csharp string">"Mouse Y"</code><code class="csharp plain">) * 3);</code></div><div class="line number23 index22 alt2"><code class="csharp spaces"> </code> </div><div class="line number24 index23 alt1"><code class="csharp spaces"> </code><code class="csharp plain">transform.localRotation = Quaternion.AngleAxis(rot.x, Vector3.up);</code></div><div class="line number25 index24 alt2"><code class="csharp spaces"> </code><code class="csharp plain">transform.localRotation *= Quaternion.AngleAxis(rot.y, Vector3.left);</code></div><div class="line number26 index25 alt1"><code class="csharp spaces"> </code> </div><div class="line number27 index26 alt2"><code class="csharp spaces"> </code><code class="csharp plain">transform.position += transform.forward * 3 * Input.GetAxis(</code><code class="csharp string">"Vertical"</code><code class="csharp plain">);</code></div><div class="line number28 index27 alt1"><code class="csharp spaces"> </code><code class="csharp plain">transform.position += transform.right * 3 * Input.GetAxis(</code><code class="csharp string">"Horizontal"</code><code class="csharp plain">);</code></div><div class="line number29 index28 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number30 index29 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>Now when you push space you'll raycast from the camera straight forwards and set the block hit to air. Also this script has some basic camera movement added so use the mouse to look around and W, A, S and D to move around. You should be able to destroy blocks in the chunk generated and do something like this:</p>
<p> </p></bodytext></div> </div> <img src="./Part 4_files/modify.png"> <div id="filler"> <div class="description"> <bodytext><p></p>
<p>Before we continue we'll need to make a change to the World script so <strong>open World.cs</strong> and scroll to the set block function. The problem we have is that we update the chunk containing the block we set but when it's on the edge of the chunk we really need to update the neighbour as well for any blocks that face the block set. So fist add this function to world:</p>
<p> </p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_355102" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">void</code> <code class="csharp plain">UpdateIfEqual(</code><code class="csharp keyword">int</code> <code class="csharp plain">value1, </code><code class="csharp keyword">int</code> <code class="csharp plain">value2, WorldPos pos)</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(value1 == value2)</code></div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Chunk chunk = GetChunk(pos.x, pos.y, pos.z);</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(chunk != </code><code class="csharp keyword">null</code><code class="csharp plain">)</code></div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">chunk.update = </code><code class="csharp keyword">true</code><code class="csharp plain">;</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>and then under the chunk.update = true line in SetBlock add calls to the new function:
</p></bodytext></div> </div> <div class="codeblock"><div><div id="highlighter_268663" class="syntaxhighlighter csharp"><table border="0" cellpadding="0" cellspacing="0"><tbody><tr><td class="gutter"><div class="line number1 index0 alt2">1</div><div class="line number2 index1 alt1">2</div><div class="line number3 index2 alt2">3</div><div class="line number4 index3 alt1">4</div><div class="line number5 index4 alt2">5</div><div class="line number6 index5 alt1">6</div><div class="line number7 index6 alt2">7</div><div class="line number8 index7 alt1">8</div><div class="line number9 index8 alt2">9</div><div class="line number10 index9 alt1">10</div><div class="line number11 index10 alt2">11</div><div class="line number12 index11 alt1">12</div><div class="line number13 index12 alt2">13</div><div class="line number14 index13 alt1">14</div><div class="line number15 index14 alt2">15</div><div class="line number16 index15 alt1">16</div><div class="line number17 index16 alt2">17</div><div class="line number18 index17 alt1">18</div></td><td class="code"><div class="container"><div class="line number1 index0 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">public</code> <code class="csharp keyword">void</code> <code class="csharp plain">SetBlock(</code><code class="csharp keyword">int</code> <code class="csharp plain">x, </code><code class="csharp keyword">int</code> <code class="csharp plain">y, </code><code class="csharp keyword">int</code> <code class="csharp plain">z, Block block)</code></div><div class="line number2 index1 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number3 index2 alt2"><code class="csharp spaces"> </code><code class="csharp plain">Chunk chunk = GetChunk(x, y, z);</code></div><div class="line number4 index3 alt1"><code class="csharp spaces"> </code> </div><div class="line number5 index4 alt2"><code class="csharp spaces"> </code><code class="csharp keyword">if</code> <code class="csharp plain">(chunk != </code><code class="csharp keyword">null</code><code class="csharp plain">)</code></div><div class="line number6 index5 alt1"><code class="csharp spaces"> </code><code class="csharp plain">{</code></div><div class="line number7 index6 alt2"><code class="csharp spaces"> </code><code class="csharp plain">chunk.SetBlock(x - chunk.pos.x, y - chunk.pos.y, z - chunk.pos.z, block);</code></div><div class="line number8 index7 alt1"><code class="csharp spaces"> </code><code class="csharp plain">chunk.update = </code><code class="csharp keyword">true</code><code class="csharp plain">;</code></div><div class="line number9 index8 alt2"><code class="csharp spaces"> </code> </div><div class="line number10 index9 alt1"><code class="csharp spaces"> </code><code class="csharp comments">//Add these lines line</code></div><div class="line number11 index10 alt2"><code class="csharp spaces"> </code><code class="csharp plain">UpdateIfEqual(x - chunk.pos.x, 0, </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(x - 1, y, z));</code></div><div class="line number12 index11 alt1"><code class="csharp spaces"> </code><code class="csharp plain">UpdateIfEqual(x - chunk.pos.x, Chunk.chunkSize - 1, </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(x + 1, y, z));</code></div><div class="line number13 index12 alt2"><code class="csharp spaces"> </code><code class="csharp plain">UpdateIfEqual(y - chunk.pos.y, 0, </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(x, y - 1, z));</code></div><div class="line number14 index13 alt1"><code class="csharp spaces"> </code><code class="csharp plain">UpdateIfEqual(y - chunk.pos.y, Chunk.chunkSize - 1, </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(x, y + 1, z));</code></div><div class="line number15 index14 alt2"><code class="csharp spaces"> </code><code class="csharp plain">UpdateIfEqual(z - chunk.pos.z, 0, </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(x, y, z - 1));</code></div><div class="line number16 index15 alt1"><code class="csharp spaces"> </code><code class="csharp plain">UpdateIfEqual(z - chunk.pos.z, Chunk.chunkSize - 1, </code><code class="csharp keyword">new</code> <code class="csharp plain">WorldPos(x, y, z + 1));</code></div><div class="line number17 index16 alt2"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div><div class="line number18 index17 alt1"><code class="csharp spaces"> </code><code class="csharp plain">}</code></div></div></td></tr></tbody></table></div></div></div><div id="filler"> <div class="description" style="padding-top:0px"> <bodytext><p></p>
<p>What this does is check if value1 and value 2 are equal and if so update the chunk containing the position. We call it for x, y and z for the upper and lower bounds of the chunk. We subtract the block position from the value to get the block's local position. This should ensure that bordering chunks are always updated.</p>
<p><a href="https://web.archive.org/web/20150311034426/http://alexstv.com/index.php/posts/unity-voxel-block-tutorial-pt-3" class="inline_button" style="background-color:#2D9AE3">Tutorial part 3</a><a href="https://web.archive.org/web/20150311034426/http://alexstv.com/downloads/voxeltut4.zip" class="inline_button" style="background-color:#2D9AE3">Download scripts so far</a>
<a href="https://web.archive.org/web/20150311034426/http://alexstv.com/index.php/posts/unity-voxel-block-tutorial-pt-5" class="inline_button" style="background-color:#2D9AE3">Tutorial part 5</a><br><br></p>
<p><a href="https://web.archive.org/web/20150311034426/https://twitter.com/stv_alex" class="inline_button" style="background-color:#77B1D1">Follow me on twitter</a><a href="https://web.archive.org/web/20150311034426/https://plus.google.com/+AlexandrosStavrinou/posts" class="inline_button" style="background-color:#D73D32">Add me on Google+</a><br><br></p>
</bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>6th Jan, 2015</stamptext>
</div>
<div class="authorstamp">
<stamptext>Alex</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<bodytext>
<form id="comment" class="commentform commentbox" method="post" action="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/posts/unity-voxel-block-tutorial-pt-4#comment">
<p class="name">
<label for="name">Your name:</label>
<input name="name" id="name" type="text" placeholder="Your name" value=""> </p>
<p class="email">
<label for="email">Your email address:</label>
<input name="email" id="email" type="email" placeholder="Your email (won’t be published)" value=""> </p>
<p class="textarea">
<label for="text">Your comment:</label>
<textarea name="text" id="text" placeholder="Your comment"></textarea> </p>
<p class="submit">
<button class="btn" type="submit">Post Comment</button> </p>
</form>
</bodytext>
</div>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Jack</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
Hm, I am testing out the remove block function, I notice on the bottom layer of the chunk, blocks get removed too? </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>1 month ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #27</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Evan</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
Hey Alex!
I don't really know what to do with the block editing code.
I completed the whole tutorial and managed to get everything working - except placing blocks.
I am trying to use the " position += (hit.normal *-0.5f); " from older tutorial, but that just glitches out.
Any help? ;) </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>4 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #47</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Lee Eastaff</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
Hey Alex,
I followed the tutorial but I can not add block to a chunk ,
Here is the code I am using
World.SetBlock(Mathf.FloorToInt(hit.point.x), Mathf.FloorToInt(hit.point.y), Mathf.FloorToInt(hit.point.x), new BlockGrass());
Cheers for any help you can give
</bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>3 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #51</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Steven</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
I added the Modify script, but it doesn't seem to do anything. I can't move around, the mouse doesn't let me look around, and I can't destroy blocks. Unity version 4.6.2f1 </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>3 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #53</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Steven</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
Got it to work by putting the Modify script on the Main Camera. However, sometimes when removing blocks, one of the sides that should be displayed is not being displayed, allowing me to see completely through the terrain. Here's an example picture: http://i.imgur.com/ONvGsDF.png
On a side note, I changed the last two lines in the Modify script so that it moves around more slowly:
transform.position += transform.forward * .1f * Input.GetAxis("Vertical");
transform.position += transform.right * .1f * Input.GetAxis("Horizontal"); </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>3 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #54</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Steven</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
Seem to have it working now. Just had to add in the last two pieces of code at the end of the tutorial. I figured it should have been working before that because in his picture he didn't have any holes like I did. Works fine now anyway. Cheers. </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>3 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #55</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Luis</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
ok .. i followed the whole tutorial and it works great :)
First of all: Thanks for your work.
In the modify.cs you'd tested to destroy a block. ok..So i've added a FPS Controller to the MainCam and changed the modify.cs that i can detroy a block with the right mouse button. Works... but if i want to add a block at any other place (with right mouse button, just on the top or side of an existing block) it just adds me a block, if i'm exactly at the same position i'd destroyed an old one before. hm...So can you help me out how i can add a function in modify.cs to add a new block somewhere ? </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>2 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #66</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Luis</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
omg.. ok.. it was TO easy :D Just "Terrain.SetBlock(hit, new BlockGrass(), true );" connected to the other mouse button and it works.. so far... Now i just have to find out how to change between different blocktypes and add check-function that i cant set a new block close to the player.... by the way. Is it possible to make the single blocks a little bit smaller? just resizing the chunk prefab doesnt work :D </bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>2 weeks ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #67</stamptext>
</div>
<section class="yspace"></section>
</div>
<div class="post">
<div id="filler">
<div class="description">
<bodytext>
<h1>Michael</h1>
</bodytext>
</div>
</div>
<div id="filler">
<div class="description">
<bodytext>
You forgot to mention that you need to put the Modify script onto the camera for it to work. lol
@Luis
You could make the blocks smaller by scaling them down in the code that creates the visual mesh, and the collider mesh. You of course would need to do both or your collider mesh wouldn't match your visual geometry so collision would be all messed up in your world then. This would require changes in a lot of other code too though as the program expects block boundaries to be on integer positions the way it is set up.
You'd possibly want to add a static blockSize variable on the Block base class to specify the size of a block. It's value would be 1.0f for the block size we are using in this tutorial series. 0.5f would make the blocks half that size. Then you'd just have to modify all the code to take that variable into account so everything works properly.
</bodytext>
</div>
</div>
<section class="yspace"></section>
<div class="datestamp">
<stamptext>2 days ago</stamptext>
</div>
<div class="authorstamp">
<stamptext>Comment #89</stamptext>
</div>
<section class="yspace"></section>
</div>
</article>
</div>
<div class="bg1">
<footer class="wrapper">
<footer class="footer">
<div class="fiftyfifty" style="padding:10px;"><bodytext>© 2015 AlexStv. All rights reserved.</bodytext></div>
<div class="fiftyfifty"><form id="search" action="https://web.archive.org/web/20150311034426/http://alexstv.com:80/index.php/search" method="post">
<bodytext>Search: </bodytext>
<input type="search" style="width:300px; padding:10px; border: 1px solid #e8e8e8;
-webkit-border-radius: 3px;
-moz-border-radius: 3px;
border-radius: 3px;" id="term" name="term" placeholder="Type here and hit enter to search" value=""></form></div>
</footer>
</footer>
</div>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//web.archive.org/web/20150311034426/http://www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-58007562-1', 'auto');
ga('send', 'pageview');
</script>
<!--
playback timings (ms):
LoadShardBlock: 42.219 (3)
esindex: 0.006
captures_list: 59.906
CDXLines.iter: 12.832 (3)
PetaboxLoader3.datanode: 378.143 (4)
exclusion.robots: 0.334
exclusion.robots.policy: 0.319
RedisCDXSource: 1.637
PetaboxLoader3.resolve: 169.553
load_resource: 553.752
--></body></html>